线程的状态

线程的状态
#

  首先贴出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):

  已终止线程的线程状态,线程已经结束执行。可以看停止线程的方式

posted @ 2017-07-25 19:09  何必等明天  阅读(413)  评论(0编辑  收藏  举报