Java线程生命周期

2018-06-10  本文已影响27人  黎繁介

周期状态:新建,就绪,运行,阻塞,死亡。

a.新建

        当使用new关键字创建一个线程时,JVM为其分配内存并初始化成员变量。此时的状态为新建状态,既不会执行线程体也不会,也不会表现出任何动态。

b.就绪

        对刚创建好的线程来调用start()方法(此方法只能调用一次),线程进入就绪状态。JVM为其创建方法调用栈和程序计数器,此时该线程可以运行了,但何时运行取决于JVM里线程调度器的调度。

下面代码试例:

c.运行

        就绪状态的线程获得了CPU,开始运行run()方法线程执行体,则该线程处于运行状态。

注意:对于一个CPU,任何时刻只会有一个线程在运行,对于多个CPU,线程执行会处于并行(Parallel),不过,当线程数大于CPU个数的时候,还会有线程在同一个CPU上并发执行。

d.阻塞

        当然,线程不可能一直处于运行状态(除非线程体非常短,马上就执行完),运行过程中需要被打断,让另一个线程运行。既对抢占式策略的系统来说,系统会给每一个线层一段的运行时间,当过了这段时间,系统会剥夺这个线程所占的资源,让其它线程获得执行的机会(系统选择下一个线程会考虑线程优先级)。

以下状况,线程会进入阻塞状态:

        1.线程调用sleep方法主动放弃所占的处理器资源。

            (调用sleep方法的线程超过了指定时间重新就如就绪状态)

         2.线程调用了一个阻塞式IO方法,在该方法返回结果之前,该线程被阻塞。

          (线程中调用的阻塞式IO方法已经返回结果重新就如就绪状态)

         3.线程试图获得一个同步监视器,但该监视器正在被其它线程所持有。

          (线程成功的获得了同步监视器重新就如就绪状态)

         4.线程等待某个通知(notify)。

          (线程正在等待某个通知时,其它线程发送了通知重新就如就绪状态)

         5.程序调用了suspend方法将该线程挂起(这个方法容易死锁,应当避免使用)。

            (处于关起状态的线程调用了resume恢复方法重新就如就绪状态)

e.死亡

        线程执行完run()方法线程体、抛出一个未捕获的Exception或error或调用stop()方法结束此线程,线程进入死亡状态。

         1.run()方法执行完,线程正常结束。

         2.线程抛出了以个未 捕获的Exception或error。

         3.直接调用该线程的stop()方法结束线程(调用此方法容易造成死锁,不建议使用)。

一张图大致理解:


-------------------上一节“Java-创建线程基本思路”---------------------

-------------------下一节“Java-线程同步代码块”-----------------------

上一篇 下一篇

猜你喜欢

热点阅读