面时莫慌 | 一文看懂线程的生命周期(二)

本文详细解析Java线程的WAITING、TIME_WAITING和BLOCKED状态的区别,以及sleep、wait、join、yield方法对线程的影响。线程状态转换图表和实例帮助理解这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


theme: jzman

这是我参与更文挑战的第22天,活动详情查看: 更文挑战

紧接着前面的内容 《一文看懂线程的生命周期(一)》,全面解答文章一开始提出的问题。

三、问题解答

3.1TIME-WAITINGWAITING区别是什么?

WAITING是死等,除非中断、产生异常,主动释放。TIME-WAITING 是超时的等,除了WAITING的触发条件,还采取我不笨,我只等我想等的时间,过时不候的策略。

3.2BLOCKED*WAITING状态区别是什么?

Java官方 Thread.StateBLOCKED的定义是:

A thread that is blocked waiting for a monitor lock is in this state。

大致意思是该线程在等待监视器(Monitor)锁定时被阻止,处于此状态。

WAITING的定义是:

A thread that is waiting indefinitely for another thread to perform a particular action is in this state.

大致意思是无限期等待另一个线程执行特定操作的线程处于此状态。

哈哈,是不是看了也很懵,我也是。因为官方只是解释了是什么,但是没有对比这这两者的区别。

BLOCKED其实本身也是处于一种阻塞的状态,所以把它看作一种特殊的WAITING也是可以的。简单的说,WAITING代表当前线程正在等待一些工作,所以当前线程现在很空闲。BLOCKED代表当前线程正忙于完成工作,但是另一个线程挡住了当前线程的路,所以当前线程现在很空闲。

也许你还是不明白,用个表说明一切。

| BLOCKED | WAITING | | ------------------------------------------------------------ | ------------------------------------------------------------ | | 当其它线程通知WAITING状态的线程,WAITING状态的线程会扭转到此状态;在未获得对象锁之前,该线程将长期处于此状态。 | 线程在同步代码块中使用#wait#join方法会使本线程处于此状态,除非其它线程对同一对象调用#notify#notifyAll方法。 | | 阻塞的是等待其它线程释放锁。 | 阻塞的是等待其它线程来通知。 | | 不可中断 | 可被中断 |

如果你还不能明白,那我只能放大招了,如下图。

同步.png

图上,一共有两个线程争夺锁资源,线程1刚开始获取到锁资源,处于RUNNING状态,然后执行了#wait方法,处于WAITING状态,线程2通过CPU调度获得锁资源,处于RUNNING状态,执行了一段时间后,线程2对同一对象调用#notify方法,线程1收到通知,扭转状态为BLOCKED,等待对象锁Monitor释放。线程2执行完,释放锁,线程1获取到锁,状态变为RUNNING

3.3sleepwaitjoinyield几个函数执行对线程分别影响是什么?

再讲各自对线程的影响之前,我们必要先认识到线程之间竞争的资源不但有锁资源,还有CPU资源。

| sleep | wait | join | yield | | ------------------------------------------------------ | ---------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | 使线程处于WAITING状态 | 使线程处于WAITING状态 | 使线程处于WAITING状态 | 执行完成线程仍然处于RUNNING状态(就绪态) | | 释放CPU资源,不释放锁资源 | 释放CPU、锁资源 | 释放CPU、锁资源 | 释放CPU资源,不释放锁资源 | | 超时完成后扭转为RUNNING状态(就绪态) | 被通知后扭转为BLOCKED状态 | 被通知后扭转为BLOCKED状态 | 有可能从马上就能从RUNNING状态(就绪态)变为RUNNING状态(运行态) | | 线程方法 | Object方法 | Object方法 | 线程方法 | | 不必在同步代码块内执行 | 必须在同步代码块内执行 | 不必在同步代码块内执行 | 不必在同步代码块内执行 | | 阻塞线程,在一定程度上,使执行流程串行,达到同步的作用 | 阻塞线程,用于线程之间的通信 | 让当前线程等待执行#join方法的线程结束,使执行流程串行,达到同步的作用 | 暂停线程,让同优先级的程序有执行的机会 |

注意: 主线程调用其它线程的#sleep方法,只会让当前线程休眠。


哥佬倌,莫慌到走!觉好留个赞,探讨上评论。欢迎关注面试专栏面时莫慌 | Java并发编程,面试加薪不用愁。也欢迎关注我,一定做一个长更的好男人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值