从源码可知,线程的状态有以下6种:
(1)新建(New):创建后尚未启动的线程的状态
(2)运行(Runnable):包含Running和Ready。
处于此状态的线程,有可能正在执行,也有可能在等待cpu为它分配执行时间,处于Running状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权,处于Ready状态的线程,在获得cpu时间后,就变为Running状态的线程。
(3)无限期等待(Waiting):不会被分配cpu执行时间,需要显示被唤醒。
以下操作会让线程进入无限期等待状态:
<1>没有设置Timeout参数的Object.wait()方法;
<2>没有设置Timeout参数的Thread.join()方法;
<3>调用了LockSupport.park()方法。
(4)限期等待(Timed Waiting):在一定时间后会由系统自动唤醒。
<1>Thread.sleep()方法;
<2>设置了Timeout参数的Object.wait()方法;
<3>设置了Timeout参数的Thread.join()方法;
<4>LockSupport.parkNanos()方法;
<5>LockSupport.parkUntil()方法。
(5)阻塞(Blocked):等待获取排它锁。
阻塞状态与等待状态的区别是,阻塞状态在等待获取一个排它锁,这个事件将在另一个线程放弃这个锁的时候发生,而等待状态,则是在等待一段时间,或者是有唤醒动作的时候发生。在程序等待进入同步区域的时候,线程将进入Blocked状态,比如说,当某个线程进入synchronized关键字修饰的方法或者代码块,即获取锁去执行的时候,其他想进入此方法或代码块的线程就只能等着,它们的状态便是Blocked。
(6)结束(Terminated):已终止线程的状态,线程已经结束执行。
当线程的run方法完成时或主线程的main方法完成时,我们就认为它终止了。这个线程对象也许是活的,但是它已经不是一个单独执行的线程,线程一旦被终止了,就不能复生,在一个终止的线程上调用start方法,会报异常。
Java多线程与并发-8.5 线程的状态
最新推荐文章于 2022-05-17 08:49:36 发布