【多线程基础】Java线程的六种状态

ops/2024/9/23 9:30:35/

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:Java多线程

在这里插入图片描述

📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。

在这里插入图片描述

目录

  • 一、线程的状态
    • 1.观察线程的所有状态
    • 2.线程状态和状态转移的意义
  • 二、 等待一个线程 - join()
  • 三、获取当前线程引用
  • 四、休眠当前线程

一、线程的状态

  • 之前谈到的“进程的状态”,更准确的说,是“线程的状态”,或者叫做“PCB的状态”
  • Java 中,对于线程的状态,大概是分成 6 中不同的状态~~

1.观察线程的所有状态

java">public static void main(String[] args) {for (Thread.State state : Thread.State.values()){System.out.println(state);}}

在这里插入图片描述


  • NEW:Thread对象有了,还没调用start,系统内部的线程还未创建
java">public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {System.out.println("hello");});System.out.println("start之前的状态:" + t.getState());t.start();t.join();System.out.println("start之后的状态:" + t.getState());}

在这里插入图片描述


  • TERMINATED:线程已经终止了,内核中的线程已经销毁了,Thread还在

  • RUNNABLE:就绪状态(可运行状态)(指这个线程“随叫随到”,正在CPU上执行或者没在CPU上执行,随时可以调度到CPU上执行)

  • WAITING:死等进入的阻塞

java">public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//死等版本的 joint.join();}

在这里插入图片描述


  • TIMED_WAITING:带有超时时间的等
java">public static void main(String[] args) throws InterruptedException {Thread t = new Thread(() -> {while (true){System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();//带有超时时间版本的 joint.join(3600 * 1000);}

在这里插入图片描述


在这里插入图片描述


  • BLOCKED: 这几个都表示排队等着其他事情

2.线程状态和状态转移的意义

在这里插入图片描述


在这里插入图片描述


还是我们之前的例⼦:
刚把李四、王五找来,还是给他们在安排任务,没让他们行动起来,就是 NEW 状态;
当李四、王五开始去窗⼝排队,等待服务,就进入到 RUNNABLE 状态。该状态并不表示已经被银行工作人员开始接待,排在队伍中也是属于该状态,即可被服务的状态,是否开始服务,则看调度器的调度;
当李四、王五因为⼀些事情需要去忙,例如需要填写信息、回家取证件、发呆⼀会等等时,进⼊
BLOCKEDWATINGTIMED_WAITING 状态,⾄于这些状态的细分,我们以后再详解;
如果李四、王五已经忙完,为 TERMINATED 状态。
所以,之前我们学过的 isAlive() 方法,可以认为是处于不是 NEW 和 TERMINATED 的状态都是活着的。

观察 1: 关注 NEWRUNNABLETERMINATED 状态的转换

java">public static void main(String[] args) {Thread t = new Thread(() -> {for (int i = 0; i < 1000_0000; i++) {}},"李四");System.out.println(t.getName() + ":" + t.getState());t.start();while (t.isAlive()){System.out.println(t.getName() + ":" + t.getState());}System.out.println(t.getName() + ":" + t.getState());}

在这里插入图片描述


观察 2: 关注 WAITING BLOCKEDTIMED_WAITING 状态的转换

java">public static void main(String[] args) {final Object object = new Object();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (object){while (true){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}},"t1");t1.start();Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (object){System.out.println("hehe");}}},"t2");t2.start();}

在这里插入图片描述


在这里插入图片描述


使用 jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED

  • 修改上面的代码, 把 t1 中的 sleep 换成 wait
java">public static void main(String[] args) {final Object object = new Object();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (object){while (true){try {object.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}}}},"t1");t1.start();Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (object){System.out.println("hehe");}}},"t2");t2.start();}

在这里插入图片描述


使⽤ jconsole 可以看到 t1 的状态是 WAITING

结论:

  • BLOCKED 表示等待获取锁, WAITINGTIMED_WAITING 表示等待其他线程发来通知.
  • TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒

二、 等待一个线程 - join()

有时,我们需要等待⼀个线程完成它的⼯作后,才能进行自己的下⼀步⼯作。例如,张三只有等李四转账成功,才决定是否存钱,这时我们需要一个方法明确等待线程的结束。

方法说明
public void join等待线程结束
public void join(long millis)等待线程结束,最多等 millis 毫秒
public void join(long millis,int nanos)同理,更高精度
java">public static void main(String[] args) throws InterruptedException {Runnable target = () -> {for (int i = 0; i < 3; i++) {System.out.println(Thread.currentThread().getName()+ ":我还在工作!");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(Thread.currentThread().getName() + ":我结束了!");};Thread t1 = new Thread(target,"李四");Thread t2 = new Thread(target,"王五");System.out.println("先让李四开始工作");t1.start();t1.join();System.out.println("李四工作结束了,开始让王五开始工作");t2.start();t2.join();System.out.println("王五工作结束了");}

在这里插入图片描述


三、获取当前线程引用

方法说明
public static void currentThread()返回当前线程的引用

在这里插入图片描述

四、休眠当前线程

也是我们比较熟悉⼀组⽅法,有⼀点要记得,因为线程的调度是不可控的,所以,这个方法只能保证实际休眠时间是大于等于参数设置的休眠时间的。

java">public static void main(String[] args) throws InterruptedException {System.out.println("start:" + System.currentTimeMillis());Thread.sleep(3 * 1000);System.out.println("end:" + System.currentTimeMillis());}

在这里插入图片描述

这里有一定的误差

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/ops/98804.html

相关文章

框架——MyBatis查询(单表查询,多表联查)

目录 1.单表查询 2.多表查询 想查询student并且查询student所选择的专业major ①通过id查一个 ②不传入值直接查所有的学生列表 ③嵌套查询 想查询专业major并且查询该专业被哪些学生student选择 ①通过id查一个 ②不传入值直接查所有的专业列表 ③嵌套查询 3. 设置自动…

R 语言学习教程,从入门到精通,R Excel 文件使用(18)

1、R Excel 文件 Excel 格式的文件主要是 xls 或 xlsx&#xff0c;这两种文件可以在 R 语言中导入 xlsx 库来实现直接的读取。 R 语言读写 Excel 文件需要安装扩展包&#xff0c;我们可以在 R 到控制台输入以下命令来安装&#xff1a; install.packages("xlsx", re…

java设计模式--创建型设计模式

创建型模式可分为&#xff1a;单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式 单例模式 单例模式 就是采取一定的方法保证在整个软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个获取其对象的方法&#xff08;静态方法&#xf…

Apache Paimon V0.9最新进展

摘要&#xff1a;本文整理自 Paimon PMC Chair 李劲松老师在 8 月 3 日 Streaming Lakehouse Meetup Online&#xff08;Paimon x StarRocks&#xff0c;共话实时湖仓架构&#xff09;上的分享。主要分享 Apache Paimon V0.9 的最新进展以及遇到的一些挑战。 一、Paimon&#x…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels1, out_channels 10 // 2, kernel_size3, stride2, padding0, biasFalse) in_channels in_channels 可以设置成1&#xff0c;2&#xff0c;3&#xff0c;4等等都可以&#xff0c;一般来说做图像识别…

无人机之如何利用无人机进行地形测绘

一、无人机的选择 多旋翼无人机&#xff1a;多旋翼无人机具有较好的稳定性和悬停能力&#xff0c;适用于复杂地形和需要高精度影像测绘任务。 固定翼无人机&#xff1a;固定翼无人机飞行速度快&#xff0c;续航能力强&#xff0c;更适合大面积的地形测绘工作。 消费级无人机…

ant design pro 的表分层级如何处理

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的ant design pro 中用户的表单如何控制多个角色ant des…

Java笔试面试题AI答之线程(12)

文章目录 67. 简述Java死锁的检测方式 &#xff1f;1. 使用jstack命令2. 使用JConsole工具3. 使用jvisualvm工具4. 编程方式检测 68. 编写Java代码实现一个死锁的案例 &#xff1f;69. 如何使用双重检查锁定在 Java 中创建线程安全的单例&#xff1f;70. 解释为什么等待和通知是…