线程的六种状态介绍
线程的几种状态可以在 Thread 类的源码中看到,它位于名叫 State 的枚举中。
如下所示,一共有六种。
1. 新建(New):线程创建后尚未启动的状态(即创建后还未调用 start() 方法)。
2. 可运行(Runnable):可能正在运行,也可能正在等待 CPU 时间片,包含了操作系统线程状态中的 Running 和 Ready。
3. 阻塞(Blocked):等待获取一个排它锁,如果其线程释放了锁就会结束此状态,所以这里的阻塞指的是阻塞于锁。
4. 无限期等待(Waiting):等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。
下面是源码注释中的举例。
翻译一下。
进入方法 | 退出方法 |
---|---|
没有设置 Timeout 参数的 Object.wait() 方法 | 其他线程调用 Object.notify() / Object.notifyAll() |
没有设置 Timeout 参数的 Thread.join() 方法 | 被调用的线程执行完毕 |
LockSupport.park() 方法 | LockSupport.unpark(Thread) |
5. 限期等待(Timed Waiting):无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。
来自源码注释中的举例。
进入方法 | 退出方法 |
---|---|
Thread.sleep(long millis) 方法 | millis 时间结束 |
设置了 Timeout 参数的 Object.wait() 方法 | 时间结束 / Object.notify() / Object.notifyAll() |
设置了 Timeout 参数的 Thread.join() 方法 | 时间结束 / 被调用的线程执行完毕 |
LockSupport.parkNanos() 方法 | LockSupport.unpark(Thread) |
LockSupport.parkUntil() 方法 | LockSupport.unpark(Thread) |
6. 结束(Terminated):表示当前线程已经执行完毕
线程状态转换
注意:
- 双向箭头代表两个状态之间转换是双向的。
- 如果线程在 Runnable、Blocked、Waiting、Time waiting 这四种状态中的任意一种状态中抛出了异常,线程都将进入 Terminated 状态。