本文主要讲解Java中线程的状态。Java中线程的状态和操作系统中线程的状态有所不同。
目录
- 线程的生命周期
- 线程的状态
线程的生命周期
此图是根据自己的了解画的,如果有不足或错误欢迎指正。
线程的状态
Java中线程有哪些状态在Thread.State枚举中的介绍得很清楚。六种状态分别是NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。在某一时间点,一个线程只能处于这些状态中的一种。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。
NEW
新建状态。尚未启动的线程的状态。如MyThread thread = new MyThread();
,thread就处于NEW状态。
RUNNABLE
就绪状态(可运行状态)。可运行线程的线程状态。thread.start();
后,thread就处在处于RUNNABLE状态。RUNNABLE状态的某一线程可能正在Java虚拟机中运行,但它也可能正在等待操作系统中的其他资源,比如CPU。一个线程在获得CPU的资源后,才可以执行任务,否则排队等待。
BLOCKED
阻塞状态。 线程因为某些原因暂时停止运行,它就进入了阻塞状态。直到某些条件发生,线程进入就绪状态,才有机会继续运行。
线程进入阻塞状态有如下原因:
- 运行时的线程调用某一对象的同步方法,若该对象的同步锁被别的线程占用,就只好进入阻塞状态。等到获得了同步锁,才能进入就绪状态。(API上只说了这一个原因)
- 线程执行I/O操作或进行远程通信时,会因为等待相关的资源而进入阻塞状态。等到获得了相关资源,才能进入就绪状态。(待确定)
WAITING
等待状态。某一等待线程的线程状态。处于等待状态的线程正等待另一个线程,以执行特定操作。某一线程因为调用下列方法之一而处于等待状态:
- 不带超时值的Object.wait。已经在某一对象上调用了Object.wait()的线程正等待另一个线程,以便在该对象上调用Object.notify()或Object.notifyAll()。
- 不带超时值的Thread.join。已经调用了Thread.join()的线程正在等待指定线程终止。
- LockSupport.park。
TIMED_WAITING
定时等待状态。具有指定等待时间的某一等待线程的线程状态。某一线程因为调用以下带有指定正等待时间的方法之一而处于定时等待状态:
- Thread.sleep。线程执行了Thread.sleep(int n)方法,线程将在n毫秒内放弃CPU,然后进入就绪状态。
- 带有超时值的Object.wait。已经在某一对象上调用了Object.wait(long timeout)的线程正等待另一个线程,当对应的notify()被调用或者超出指定时间时线程重新进入就绪状态。
- 带有超时值的Thread.join。例如,已经调用了join(long millis)的线程正在等待指定线程终止。等待该线程终止的时间最长为millis毫秒。超时为 0 意味着要一直等下去。
- LockSupport.parkNanos。
- LockSupport.parkUntil。
TERMINATED
终止状态。已终止线程的线程状态。线程已经结束执行。
在对Thread类做讲解时会讲到上述内容涉及到的方法。
本文就讲到这里,想了解更多内容请参考:
- Java并发编程札记-目录
END.