线程的状态
线程的状态 #
首先贴出JDK6中线程的6种状态(注意:JDK8中的定义也没有变化)
线程的状态
新建(New)
当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。此时还没有开始运行线程中的代码。
可运行(Runable)
一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当start()方法返回后,线程就处于就绪状态。
Runable包括了操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待着CPU为它分配执行时间。线程进人Runnable状态大体分为如下5种情况:
- 调用sleep()方法,达到指定休眠时间返回。
- 线程调用的阻塞IO已经返回,阻塞方法执行完毕。
- 线程成功地获得了请求的对象锁。
- 线程正在等待某个通知,其他线程发出了通知。
- 处于挂起状态的线程调用了 resume恢复方法。
阻塞(Blocked)
线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”一般在等待着获取到一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生;而“等待状态”则是在等待一段时间,或者等待唤醒动作的发生。在程序等待进入同步区域的时候,线程将进入这种阻塞状态。
无限期等待(Waiting):
处于这种状态的线程不会被分配CPU执行时间,它们要等待被其他线程显式地唤醒。某一线程因为调用下列方法之一而处于等待状态:
- 不带超时值的 Object.wait ()
- 不带超时值的 Thread.join ()
- LockSupport.park ()
限期等待(Timed Waiting):
处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被其他线程显式地唤醒,在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态:
- 设置了sleeptime参数的Thread.sleep()方法;
- 设置了Timeout参数的Object.wait()方法;
- 设置了Timeout参数的Thread.join()方法;
- LockSupport.parkNanos()方法;
- LockSupport.parkUntil()方法。
结束(Terminated):
已终止线程的线程状态,线程已经结束执行。可以看停止线程的方式。