▶  线程状态概述

当线程被创建并启动后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。

在线程的生命周期中存在6种线程状态 ,在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态。

java timed waiting java timed waiting 原理_API

下面这张图展示了线程的6个状态:

java timed waiting java timed waiting 原理_java timed waiting_02

不需要去研究这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 的线程状态图:

java timed waiting java timed waiting 原理_线程状态_03

 

▶  BLOCKED( 锁阻塞 )

Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。

例如:线程A和线程B代码使用同一锁,如果线程A获取到锁,线程A进入到Runnable 状态,那么线程B就进入到 Blocked 锁阻塞状态。这是由 Runnable 状态进入 Blocked 状态。除此 Waiting 以及Time Waiting状态也会在某种情况下进入阻塞状态。

java timed waiting java timed waiting 原理_线程状态_04

 

▶  Waiting(无限等待)

Waiting状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。

一个调用了某个对象的 Object.wait 方法的线程会等待另一个线程调用此对象的 Object.notify() 方法或Object.notifyAll()方法。

其实 waiting 状态并不是一个线程的操作,它体现的是多个线程间的通信,可以理解为多个线程之间的协作关系,多个线程会争取锁,同时相互之间又存在协作关系。( 会有竞争但更多的时候是协作 )

waiting线程状态图:

java timed waiting java timed waiting 原理_API_05

java timed waiting java timed waiting 原理_线程状态_06

java timed waiting java timed waiting 原理_java timed waiting_07

java timed waiting java timed waiting 原理_java timed waiting_08

 

▶  补充

java timed waiting java timed waiting 原理_执行状态_09