线程状态

五个状态:新生、就绪、运行、死亡、阻塞

停止线程

  • 不推荐使用JDK提供的stop()、destroy()方法【已弃用】
  • 推荐线程自己停止
  • 建议用一个标志位进行终止变量,到flag=false,则终止线程运行
public class StopDemo implements Runnable {// 设置一个标志位boolean flag = true;@Overridepublic void run() {// 线程体使用该标志while (flag) {System.out.println("runing....");}}// 设置一个公共的方法停止线程,转换标志位public void stop() {this.flag = false;}
}

线程休眠

  • sleep(时间)指定当前线程阻塞的毫秒数
  • sleep存在异常 Interrupted Exception
  • sleep时间达到后线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等
  • 每一个对象都有一个锁,sleep不会释放锁(重点记下)

模拟网络延迟(放大问题的发生性)

抢票:

public class SleepDemo implements Runnable {// 票数private int tickeNum = 10;@Overridepublic void run() {while (true) {if (tickeNum <= 0) {break;}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(String.format("%s --> 拿到了第%d张票", Thread.currentThread().getName(), tickeNum--));}}public static void main(String[] args) {SleepDemo sleepDemo = new SleepDemo();new Thread(sleepDemo, "张三").start();new Thread(sleepDemo, "李四").start();new Thread(sleepDemo, "王五").start();}
}

从输出结果看,第4张票被多个人抢到了,产生了线程安全问题

模拟计时

public class SleepDemo2 {// 模拟倒计时public static void countDown() {int num = 5;while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")));num--;if (num==0) {break;}}}public static void main(String[] args) {countDown();}
}

线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 将线程从运行状态转为就绪状态
  • 让CPU重新调度,礼让不一定成功!看CPU心情
public class YieldDemo {public static void main(String[] args) {MyYeild myYeild = new MyYeild();new Thread(myYeild, "a").start();new Thread(myYeild, "b").start();}
}class MyYeild implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 线程开始");// 礼让Thread.yield();System.out.println(Thread.currentThread().getName() + " 线程停止");}
}

如果a线程礼让成功了,就会让b线程先跑

插队(线程强制执行)

  • Join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞
  • 可以想象成食堂插队打饭。会让线程阻塞,慎用
public class JoinDemo implements Runnable {@Overridepublic void run() {for (int i = 0; i < 1000; i++) {System.out.println("vip来了" + i);}}public static void main(String[] args) throws InterruptedException {JoinDemo joinDemo = new JoinDemo();Thread thread = new Thread(joinDemo);thread.start();// 主线程for (int i = 0; i < 500; i++) {if (i == 200) {// 插队thread.join();}System.out.println("main" + i);}}
}

在主线程中的i=100的时候,vip线程进来插队,直到vip执行完,主线程才继续

线程状态观测

通过一个枚举常量:Thread.State

public class StateDemo {public static void main(String[] args) throws InterruptedException {Thread thread = new Thread(() -> {for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("===========");}});// 观察状态  newSystem.out.println(thread.getState());// 启动后   runthread.start();System.out.println(thread.getState());// 只要线程不终止,就一直输出状态while (thread.getState() != Thread.State.TERMINATED) {Thread.sleep(500);System.out.println(thread.getState());}}
}

线程优先级

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行
  • 线程的优先级用数字表示,范围从1~10
    • Thread.MIN PRIORITY = 1;
    • Thread.MAX PRIORITY = 10;
    • Thread.NORM PRIORITY = 5;
  • 使用以下方式改变或获取优先级
    • getPriority()、setPriority(int xxx)

不一定线程优先级高的会先跑,优先级低也只是意味着获得调度的概率低,并不是优先级低就不会被调用了,主要还是取决于CPU调度,有可能会出现性能倒置。

守护线程

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如,后台记录操作日志,监控内存,垃圾回收,一些等待机制等等

Java多线程 - 线程状态相关推荐

  1. Java多线程 —— 线程状态迁移

    引言 线程状态迁移,又常被称作线程的生命周期,指的是线程从创建到终结需要经历哪些状态,什么情况下会出现哪些状态. 线程的状态直接关系着并发编程的各种问题,本文就线程的状态迁移做一初步探讨,并总结在何种 ...

  2. Java多线程-线程状态

    线程状态 6个状态定义:java.lang.Thread.State New: 尚未启动的线程的线程状态. Runnable: 可运行线程的线程状态,等待CPU调度. Blocked: 线程阻塞等待监 ...

  3. Java多线程——线程的优先级和生命周期

    Java多线程--线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  4. 线程知识点(一)—— 程序、进程、线程之间的区别与联系、Java的线程状态和生命周期

    1 程序.进程.线程之间的区别与联系 三者之间的形象化理解: * 程序:代码实现了功能,就是程序,是静态的: * 进程:执行中的程序就是进程,是动态的: * 线程:进程内的一个执行单元,也是进程内的可 ...

  5. java多线程-线程的停止【interrupt】

    java多线程-线程的停止 文章目录 java多线程-线程的停止 线程停止的原理 如何正确停止线程 在普通情况下停止线程 代码展示 在阻塞情况下停止线程 代码展示 线程在每次迭代后都阻塞 代码展示 停 ...

  6. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  7. Java 多线程线程安全(面试概念解答二)

    Java 多线程线程安全 什么是线程安全? 为什么有线程安全问题? 线程安全解决办法? 同步代码块 同步函数 静态同步函数 多线程死锁 多线程的三大特性 原子性 可见性 有序性 Java内存模型 Vo ...

  8. Java多线程【状态与安全问题】

    Java多线程[状态与安全问题]

  9. JAVA --- 多线程 -- 线程的创建

    JAVA - 多线程 – 线程的创建 线程的概念: 说起线程,先说程序和进程,多任务的概念. 程序(program):是指令和数据的有序集合,本身没有任何运行的含义,是一个静态的概念. 进程(proc ...

  10. Java多线程(线程创建、线程安全问题解决、线程状态)

    一.基础概念 1.并发和并行 2.进程与线程 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多 个进程:进程也是程序的一次执行过程,是系统运行程序的基本单 ...

最新文章

  1. MongoDB图形化管理工具
  2. idea创建mybatis的config.xml和mapper.xml方法
  3. linux下访问windows共享文件夹
  4. oracle+nvlif函数,Oracle中的NVL()、NVL2()、NULLIF()、Coalesce()函数
  5. 高并发02_同步锁的一些题目
  6. 前端学习(2306):react之组件使用之图片使用
  7. java echarts 散点图,echarts在地图上绘制散点图(任意点)
  8. jdk1.5的类转换成jdk1.4的类文件
  9. 案例演示Python二维列表与Java二维数组
  10. 一些社会运行的底层规律,和你的利益息息相关
  11. 【手记】解决“未能创建 SSL/TLS 安全通道”异常
  12. JAVA操作数据库调试经验
  13. 在sae中运行web.py应用
  14. 大型连锁百货运维审计用什么软件好?有哪些功能?
  15. 上海千锋培训python
  16. 几个炫酷的3D旋转动态效果(附代码)
  17. MATLAB 赋值具有的非单一 rhs 维度多于非单一下标数
  18. 如何把Windows10打造成Mac
  19. 通证网:一建的报考条件
  20. 使用ping测试MTU值

热门文章

  1. Android 三类框架的理解以及MVVM框架的使用
  2. 逻辑学学习.3--- 命题逻辑 (一):基本概念
  3. Selenium获取动态图片验证码
  4. GoLang获取硬盘序列号
  5. python xlwt模块下载_python 的xlwt模块
  6. 近红外光谱建模之区间偏最小二乘法python实现(ipls算法)
  7. 目前比较流行的网站开发框架有哪些?
  8. 新科LoRa网关和LoRa节点
  9. 【网页设计】基于HTML+CSS+JavaScript制作美食网站舌尖上的美食
  10. gnu nano显卡测试软件,买不到了 篇四:站内首发——RX VEGA NANO评测