Java线程的生命周期及状态控制.pdf

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java 线程的生命周期和状态控制 一、线程的生命周期 线程状态转换图: 1、新建状态 用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的 内存空间,通过调用start 方法进入就绪状态(runnable )。 注意:不能对已经启动的线程再次调用 start()方法,否则会出现 Javalang.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()方法等等,就会从运行状 态转变为死亡状态。 1 / 14 4、阻塞状态 处于运行状态的线程在某些情况下,如执行了 sleep (睡眠)方法,或等待I/O 设备等资源,将让出 CPU 并暂时停止 自己的运行,进入阻塞状态。 在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的 I/O 设备空闲下来, 线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。 5、死亡状态 当线程的 run()方法执行完,或者被强制性地终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个 单独执行的线程。线程一旦死亡,就不能复生。 如果在一个死去的线程上调用 start()方法,会抛出 java.lang.IllegalThreadStateException 异常。 二、线程状态的控制 Java 提供了一些便捷的方法用于会线程状态的控制。 . void destroy() 已过时。该方法最初用于破坏该线程,但不作任何清除。它所保持的任何监视器都会保持锁定状态。不 过,该方法决不会被实现。即使要实现,它也极有可能以 suspend() 方式被死锁。如果目标线程被破坏时保持 一个保护关键系统资源的锁,则任何线程在任何时候都无法再次访问该资源。如果另一个线程曾试图锁定该资源, 则会出现死锁。这类死锁通常会证明它们自己是 “冻结 ”的进程。有关更多信息,请参阅为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume ?。 void interrupt() 中断线程。 void join () 等待该线程终止。 void join (long millis) 等待该线程终止的时间最长为 millis 毫秒。 void join (long millis, in

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档