线程的六种状态及其转换

线程的六种状态介绍

线程的几种状态可以在 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 状态。

猜你喜欢

转载自blog.csdn.net/u013568373/article/details/94452459