线程的状态

在Thread类中有一个 整数型 变量 threadStatus ,标示了该线程的状态,它是一个int类型,但是对应的get方法返回值是一个枚举State,源码如下:

public enum State {
/**
* Thread state for a thread which has not yet started.
*/
NEW,

/**
* Thread state for a runnable thread. A thread in the runnable
* state is executing in the Java virtual machine but it may
* be waiting for other resources from the operating system
* such as processor.
*/
RUNNABLE,

/**
* Thread state for a thread blocked waiting for a monitor lock.
* A thread in the blocked state is waiting for a monitor lock
* to enter a synchronized block/method or
* reenter a synchronized block/method after calling
* {@link Object#wait() Object.wait}.
*/
BLOCKED,

/**
* Thread state for a waiting thread.
* A thread is in the waiting state due to calling one of the
* following methods:
* <ul>
* <li>{@link Object#wait() Object.wait} with no timeout</li>
* <li>{@link #join() Thread.join} with no timeout</li>
* <li>{@link LockSupport#park() LockSupport.park}</li>
* </ul>
*
* <p>A thread in the waiting state is waiting for another thread to
* perform a particular action.
*
* For example, a thread that has called <tt>Object.wait()</tt>
* on an object is waiting for another thread to call
* <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
* that object. A thread that has called <tt>Thread.join()</tt>
* is waiting for a specified thread to terminate.
*/
WAITING,

/**
* Thread state for a waiting thread with a specified waiting time.
* A thread is in the timed waiting state due to calling one of
* the following methods with a specified positive waiting time:
* <ul>
* <li>{@link #sleep Thread.sleep}</li>
* <li>{@link Object#wait(long) Object.wait} with timeout</li>
* <li>{@link #join(long) Thread.join} with timeout</li>
* <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
* <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
* </ul>
*/
TIMED_WAITING,

/**
* Thread state for a terminated thread.
* The thread has completed execution.
*/
TERMINATED;
}

1、新建状态(new)        

新创建了一个线程对象(实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来),但还没有调用start()方法。至今尚未启动的线程处于这种状态.

2、就绪状态(Runnable)  

正在 Java 虚拟机中执行的线程处于这种状态。RUNNABLE状态包括了操作系统线程状态中的Running和Ready,即线程可能正在运行,也可能正在等待其他资源或操作系统的处理,一旦获取到CPU资源进行了执行,则进入RUNNING状态。

  1. 调用线程的start()方法,此线程进入就绪状态。
  2. 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
  3. 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
  4. 锁池里的线程拿到对象锁后,进入就绪状态

3、阻塞状态(Blocked)

受阻塞并等待某个监视器锁的线程处于这种状态。阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。BLOCKED状态的线程会一直等待监视器锁,而后执行synchronized代码块/方法。或者在调用Object.wait()后,执行synchronized代码块/方法。

进入阻塞状态的原因有:①通过调用sleep(millseconds)使任务进入休眠状态;②通过调用wait()使线程挂起,直到线程获取notify()/notifyAll()消息,(或者在Java SE5中java.util.concurrent类库中等价的signal()/signalAll()消息),线程才会进入就绪状态;③任务在等待某个输入 / 输出流的完成;④任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取了该锁;

4、无限期地等待(WAITING)

无限期地等待另一个线程来执行某一特定操作的线程处于这种状态 。处于这种状态的线程不会被分配CPU执行时间,它们要等待显示的被其它线程唤醒。这种状态通常是指一个线程拥有对象锁后进入到相应的代码区域后,调用相应的“锁对象”的wait()方法操作后产生的一种结果。变相的实现还有LockSupport.park()、Thread.join()等,它们也是在等待另一个事件的发生,也就是描述了等待的意思

以下方法会让线程陷入无限期等待状态:

(1)没有设置timeout参数的Object.wait()

(2)没有设置timeout参数的Thread.join()

(3)LockSupport.park()

“阻塞”与“等待”的区别:

(1)“阻塞”状态是等待着获取到一个排他锁,进入“阻塞”状态都是被动的,离开“阻塞”状态是因为其它线程释放了锁,不阻塞了;

(2)“等待”状态是在等待一段时间 或者 唤醒动作的发生,进入“等待”状态是主动的

如主动调用Object.wait(),如无法获取到ReentraantLock,主动调用LockSupport.park(),如主线程主动调用 subThread.join(),让主线程等待子线程执行完毕再执行

离开“等待”状态是因为其它线程发生了唤醒动作或者到达了等待时间

5 限期等待(TIMED_WAITING )

处于这种状态的线程也不会被分配CPU执行时间,不过无需等待被其它线程显示的唤醒,在一定时间之后它们会由系统自动的唤醒。

通过以下方法进入TIMED_WAITING状态:

  1. 调用Thread.sleep()
  2. 调用Object.wait()超过时间阈值
  3. 调用Thread.join()超过时间阈值
  4. 调用LockSupport.parkNanos(Object,long)
  5. 调用LockSupport.parkUntil(Object,long)

6 TERMINATED 

  已退出的线程处于这种状态即线程执行完成就会变为这个状态

  1. 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
  2. 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。
原文地址:https://www.cnblogs.com/zjf6666/p/9360008.html