Java中的线程状态
Java中的线程状态可以通过getState方法获取,在java.lang.Thread.State枚举中定义,有以下6种:
-
New(新创建)
-
Runnable(可运行)
-
Blocked(被阻塞)
-
Waiting(等待)
-
Timed waiting(计时等待)
-
Terminated(被终止)
其状态转换关系如图所示:
New状态
线程创建之初即是New状态。
Runnable状态
调用start方法后即为runnable状态。该状态下线程可能处于正在运行也可能没在运行,具体取决于操作系统。与操作系统的线程状态不同,操作系统的线程状态还有就绪态。Java抽象于操作系统的线程状态,在抢占式等调度机制下都会有不同的表现,使用可运行状态概括两个状态及其转换的情况。因此,只需记住,在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行(这就是为什么将这个状态称为可运行而不是运行)。
Blocked状态
当一个线程试图获取一个内部的对象锁(注意不是java.util.concurrent库的锁),而该锁被其他线程持有时,进入阻塞状态。只有其他线程释放锁,并且线程调度器允许本线程持有该锁时,才能变成非阻塞状态。
Waiting状态
当线程等待另一个通知调度器一个条件时,它自己进入等待状态。如Object.wait或Thread.join方法,或是等待java.util.concurrent库中的Lock或Condition。
Time waiting状态
调用有超时参数的等待方法时,进入该状态,知道超时或接到通知。如Thread.sleep和Object.wait、Thread.join、Lock.tryLock及Condition.wait的超时版本。
Terminated状态
触发的原因有:
-
正常return返回
-
因没有捕获的异常终止了run方法
-
调用了stop(已弃用)方法,该方法抛出ThreadDeath错误对象,由此杀死线程