在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状态。
- 调用线程的start()方法,此线程进入就绪状态。
- 当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。
- 当前线程时间片用完了,调用当前线程的yield()方法,当前线程进入就绪状态。
- 锁池里的线程拿到对象锁后,进入就绪状态
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状态:
- 调用Thread.sleep()
- 调用Object.wait()超过时间阈值
- 调用Thread.join()超过时间阈值
- 调用LockSupport.parkNanos(Object,long)
- 调用LockSupport.parkUntil(Object,long)
6 TERMINATED
已退出的线程处于这种状态即线程执行完成就会变为这个状态
- 当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦终止了,就不能复生。
- 在一个终止的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。