黑马程序员技术交流社区

标题: 线程的生命周期,详解? [打印本页]

作者: 文江江    时间: 2014-3-8 12:57
标题: 线程的生命周期,详解?
本帖最后由 文江江 于 2014-3-8 14:57 编辑

线程的生命周期,详解?
作者: 混蛋哥    时间: 2014-3-8 13:11
新建一个线程,当调用Start()方法后线程进入就绪状态,当系统调度后进入运行状态,运行状态时如果里面的run()方法执行完毕了线程就进入死亡状态,如果执行了sleep(),join()或等待IO就进入睡眠挂起再进入就绪状态,如果进入等待状态调用了notify()或者interupt()方法就会进入阻塞状态,解锁后再进入就绪状态,如果有同步锁也会进入阻塞状态,解锁后进入就绪状态
作者: 三眼皮    时间: 2014-3-8 13:44
线程的生命周期包括:新建、就绪、运行、阻塞和死亡五种。
新建状态(new):用new命令简历一个线程后,还没有启动其指定的指令程序,这是的线程状态就是新建状态。
就绪状态(runnable):也叫可运行状态,处于新建状态的线程被启动后就进入了就绪状态。
运行状态(running):线程获得了CPU资源就进入了自动运行状态。
阻塞状态(blocked):由于某种原因只是正在运行的线程让出CPU资源暂停自己的执行,就进入阻塞状态。
死亡状态(dead):处于死亡状态的线程不具备继续裕兴的能力,死亡原因有两个:一个是正常结束,另一个是调用stop和destroy
作者: syw02014    时间: 2014-3-8 14:20
本帖最后由 syw02014 于 2014-3-8 14:36 编辑

       一、线程的状态
  1、新建状态
  用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。
  注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。
  2、就绪状态
  处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
提示:如果希望子线程调用start()方法后立即执行,可以使用Thread.sleep()方式使主线程睡眠一伙儿,转去执行子线程。
  3、运行状态
  处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。处于就绪状态的线程,如果获得了cpu的调度,就会从就绪状态变为运行状态,执行run()方法中的任务。如果该线程失去了cpu资源,就会又从运行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法,它就会让出cpu资源,再次变为就绪状态。

  当发生如下情况是,线程会从运行状态变为阻塞状态:
  ①、线程调用sleep方法主动放弃所占用的系统资源
  ②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
  ③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有
  ④、线程在等待某个通知(notify)
  ⑤、程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。
  当线程的run()方法执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态。
  4、阻塞状态
  处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。 在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。
  5、死亡状态
  当线程的run()方法执行完,或者被强制性地终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

二、线程的优先级
  1.线程的优先级及设置:线程的优先级是为了在多线程环境中便于系统对线程的调度,优先级高的线程将优先执行。
  一个线程的优先级设置遵从以下原则:线程创建时,子继承父的优先级。线程创建后,可通过调用setPriority()方法改变优先级。线程的优先级是1-10之间的正整数。
  1- MIN_PRIORITY
  10-MAX_PRIORITY
  5-NORM_PRIORITY
  如果什么都没有设置,默认值是5。但是不能依靠线程的优先级来决定线程的执行顺序。
  2.线程的调度策略:线程调度器选择优先级最高的线程运行。但是,如果发生以下情况,就会终止线程的运行:
   线程体中调用了yield()方法,让出了对CPU的占用权。
  线程体中调用了sleep()方法,使线程进入睡眠状态。
  线程由于I/O操作而受阻塞。
  另一个更高优先级的线程出现。
  在支持时间片的系统中,该线程的时间片用完。


14090829-e30f46d564fb42ae94bff7dd2e2b2c38.png (71.34 KB, 下载次数: 6)

14090829-e30f46d564fb42ae94bff7dd2e2b2c38.png

作者: 文江江    时间: 2014-3-8 15:00
syw02014 发表于 2014-3-8 14:20
一、线程的状态
  1、新建状态
  用new关键字和Thread类或其子类建立一个线程对象后,该线程对 ...

谢谢,太详细啦。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2