▶ 线程状态概述
当线程被创建并启动后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。
在线程的生命周期中存在6种线程状态 ,在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态。
下面这张图展示了线程的6个状态:
不需要去研究这6种状态的实现原理,只需要知道在做线程操作中存在这样的状态。
▶ Timed Waiting( 计时等待 )
Timed Waiting 在API中的描述为:一个正在限时等待另一个线程执行一个动作的线程处于这一状态。
之前学到过调用 sleep 方法就可以使当前执行的进程进入到 “ 休眠状态 ”,这其实就是所谓的 Timed Waiting
--- sleep 方法的使用需要注意以下几点:
(1)进入 Timed Waiting 状态的一种常见情形是调用 sleep 方法,单独的线程也可以调用,不一定非要有协作关系
(2)为了让其他线程有机会执行,可以将Thread.sleep()的调用放在线程run()之内,这样才能保证该线程执行过程中会睡眠
(3)sleep与锁无关,线程睡眠到期会自动苏醒
【 提示:sleep() 中指定的时间是线程不会运行的最短时间,因此,sleep()方法不能保证该线程睡眠到期后就立刻开始执行 】
--- 进入TimeWaiting(计时等待)有两种方式:
(1)使用sleep(long m)方法在毫秒值结束之后,线程睡醒进入到Runnable / Blocked状态
(2)使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable / Blocked 状态
--- 唤醒的方法:
(1)void notify() 唤醒在此对象监视器上等待的单个线程
(2)void notifyAll() 唤醒在此对象监视器上等待的所有线程
Timed Waiting 的线程状态图:
▶ BLOCKED( 锁阻塞 )
Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。
例如:线程A和线程B代码使用同一锁,如果线程A获取到锁,线程A进入到Runnable 状态,那么线程B就进入到 Blocked 锁阻塞状态。这是由 Runnable 状态进入 Blocked 状态。除此 Waiting 以及Time Waiting状态也会在某种情况下进入阻塞状态。
▶ Waiting(无限等待)
Waiting状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。
一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 方法或Object.notifyAll()方法。
其实 waiting 状态并不是一个线程的操作,它体现的是多个线程间的通信,可以理解为多个线程之间的协作关系,多个线程会争取锁,同时相互之间又存在协作关系。( 会有竞争但更多的时候是协作 )
waiting线程状态图:
▶ 补充