0%

并发之线程生命周期

线程生命周期

整体图

线程生命周期

状态解释

  • New: Thread 已被创建,但是还没执行start
  • Runnable: 对于JVM来说 表示程序正在执行,但是它有可能正在等待CPU的时间片
  • blocked: 等待 monitor lock,以待 进入 同步代码块或者同步方法
  • Waiting: 等待另一个线程执行一些指定的方法 如 wait() -> notify()
  • Time_waiting: 与 Waiting 的唯一区别是,等待一个之间后,才会响应另一个线程执行的指定方法
  • Terminated: 线程已经执行完

join()

t.join()

表示主线程会等待t线程执行完成后,才会继续往下执行。

源码里调用的还是 Object.wait(0) 进行等待

Thread.yield()

表示当前线程 放弃当前的CPU使用权限,然后和其他线程一同竞争下一次的CPU使用权限。

对应于上图的 Ready to Run

Thread.sleep

Thread类的方法,不释放锁。占着CPU,不工作。

Sleep 0 秒后,进入 Runnable 状态。

wait

wait:Object的方法,释放锁,一般与(notify或notifyAll)使用。不占用CPU。

当使用 wait和 notifyAll 用于 生产消费模型时,wait的使用:

1
2
3
4
5
6
7
synchronized (obj) {
// 必须使用 while 循环,不要使用 if 判断: 防止过度消费
while (condition does not hold){
obj.wait(timeout);
}
... // Perform action appropriate to condition
}

notify或notifyAll

notify 使用不当可能会造成死锁,建议使用 notifyAll

https://blog.csdn.net/liuchuanyangyan/article/details/56668153

参考

线程生命周期

Life Cycle of a Thread in Java

Java线程源码解析之yield和sleep