线程状态
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 协议 ,转载请注明出处!