线程状态

Java线程可以有一下4个状态

  • New(新生)
  • Runaable(可运行)
  • Blocked(被阻塞)
  • Dead(死亡)

新生态

当你用new Thread创建一个线程时,线程还没有运行,此时的线程处在新生态。

可运行

一旦调用了start方法,该线程就成为可运行(Runnable)的了。一个可运行的线程可能实际上正在运行,也可能没有,这取决于操作系统为该线程提供的运行时间。(不过,Java规范并没有把这种情况作为一种单独的状态。一个正在运行的线程仍然处在可运行状态。)

注意:可运行状态和Runnable接口没有任何关系

被阻塞线

当发生一下任意情况时,线程就进入被阻塞状态:

  • 线程通过调用sleep状态进入睡眠状态
  • 线程在I/O上被阻塞
  • 线程试图获得一个锁,而改锁正被其他线程持有
  • 调用线程的suspend(挂起)方法
    下图显示了线程在各个状态之间的转换关系。

如果你需啊解除I/O操作的阻塞状态,应该使用 NIO库中的通道(channel)机制。当另一个线程关闭通道时,被阻塞线程就再次变为可运行的了,而阻塞操作将抛出一个ClosedChannelException异常

死线程

有两个原因会导致线程死亡:

  • run方法正常退出而自然死亡
  • 因为一个未捕获的异常终止了run方法而使线程猝死

注意:无法确定一个活着的线程是可运行的还是被阻塞了。也无法确定一个可运行的线程是否正在运行。另外你也无法区分死亡线程和非可运行线程


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!