写在前面
本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和文献引用请见100个问题搞定Java并发
解答
线程的状态在java中有明确的定义,在java.lang.Thread.State中有6种。
① NEW
线程被创建,未执行和运行的时候
② RUNNABLE
不代表线程在跑,两种:被cpu执行的线程,随时可以被cpu执行的状态。
③ BLOCKED
线程阻塞,处于synchronized同步代码块或方法中被阻塞。
④ WAITING
等待线程的线程状态。线程当前不执行,如果被其他唤醒后会继续执行的状态。依赖另一个线程的通知的。这个等待是一直等,没人叫你,你起不来。
⑤ TIMED_WAITING
指定等待时间的等待线程的线程状态。带超时的方式:Thread.sleep,Object.wait,Thread.join,LockSupport.parkNanos,LockSupport.parkUntil
⑥ TERMINATED
正常执行完毕或者出现异常终止的线程状态。
补充
线程状态流转图
从NEW状态出发后,线程不能再回到NEW状态,同理,处于 TERMIINATED 状态的线程也不能再回到 RUNNABLE状态。
java.lang.Thread.State源码
/**
* 线程状态。线程可以处于以下状态之一:
* NEW:尚未启动的新线程处于此状态。
* RUNNABLE:在Java虚拟机中执行的线程处于此状态。
* BLOCKED:阻塞等待监视器锁定而被阻塞的线程处于此状态。
* WAITING:正在无限期等待另一个线程执行特定操作的线程处于此状态。
* TIMED_WAITING:TIMED_WAITING正在等待另一个线程执行某个操作达指定等待时间的线程处于此状态。
* TERMINATED:终止已退出的线程处于此状态。
* <p>
* 线程在给定的时间点只能处于一种状态。
* 这些状态是不反映任何操作系统线程状态的虚拟机状态。
*
* @since 1.5
*/
public enum State {
/**
* 尚未启动的线程的线程状态。
*/
NEW,
/**
* 可运行线程的线程状态。处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,如处理器。
*/
RUNNABLE,
/**
* 阻塞等待一个监视器锁时的线程状态。
* 为了进入同步块/方法处于阻塞状态的线程会等待监视器锁,或在调用{@link Object#wait() Object.wait}后重新进入同步块/方法。
*/
BLOCKED,
/**
* 等待线程的线程状态。
* 由于调用以下方法之一,线程处于等待状态:
* <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>
* 例如,对某个对象调用<tt>Object.wait()</tt>的线程正在等待另一个线程对该对象调用<tt>Object.notify()</tt>或<tt>Object.notifyAll()</tt>。
* <p>
* 调用<tt>Thread.join()</tt>的线程正在等待指定的线程终止。
*/
WAITING,
/**
* 具有指定等待时间的等待线程的线程状态。
* 由于使用指定的正等待时间调用以下方法之一,线程处于定时等待状态:
* <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,
/**
* 终止线程的线程状态。线程已完成执行。
*/
TERMINATED;
}