线程的生死

与人一样,线程的一生,不过是出生,活着,死去,活着才有那么多故事,求不得,等不到。

线程的状态:

  • New(新创建)
  • Runnable(可运行)
  • Blocked(被阻塞)
  • Waiting(等待)
  • Timed waiting(计时等待)
  • Terminated(被终止)

这里写图片描述

新创建线程

new Thread(),此线程还没有开始运行;

可运行线程

一旦调用 start 方法,线程将处于 runnable 状态,它实际上包含“可运行,没运行”和“可运行,正在运行”两个状态,因为 CPU 同一时刻只能运行一个线程,它不断切换运行多个可运行线程,这些线程就随着 CPU 的切换在这两种状态下不断转换。

被阻塞线程和等待线程

  • 当一个线程试图获取一个对象的内部锁,而该锁被其他线程拥有,则该线程进入阻塞状态。
  • 当线程等待其他线程通知一个条件时,它进入等待状态。
  • 有些方法在进入等待状态时,有一个超时参数,当它等待的时间超过设定参数,它就自动变成可运行状态,也就是说计时等待状态就是一个特殊的等待状态。

等待与阻塞的区别:
等待的线程被激活后,当重新获得锁时,会直接跳到上次等待的地方继续执行。

如图:

这里写图片描述

上图中白色的框,即锁对象内部,一个线程内可能拥有多个锁对象,上图三个可运行的线程可能是同一个线程,相应的锁对象运行完毕后,可能会通知此锁对象内的等待线程,等待线程被唤醒后重新进入阻塞队列,但这时它们已经不是普通的阻塞队列,当它们再次进入锁对象时会直接跳到上次等待的地方,继续判断,继续执行。

被终止的线程

线程死亡原因:

  • run 方法完成,自然死亡。
  • 因为一个没有捕获的异常而意外死亡。

猜你喜欢

转载自blog.csdn.net/gdeer/article/details/52971203