终止阻塞的线程编程开发技术.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
终止阻塞的线程编程开发技术.doc

终止阻塞的线程-编程 开发技术 终止阻塞的线程 原文出处:摆渡者 线程状态 我们知道,一个线程可以处于以下四种状态Z-: 1??新建(New):当线程被创建时,它只会短暂地处于这种状态。此时它已经分 配了必须的系统资源,并执行了初始化。此刻线程已经有资格获取CPU时间了, 之后调度器将把这个线程转变为可运行状态或阻塞状态。 ?就绪(Runnable):在这种状态下,只要调度器将CPU吋间片分给线程,线 程就可以运行。也就是说,在任意时刻,线程可以运行也可以不运行。 3??阻塞(Blocked):线程能够运行,但有某个或多个条件阻止它运行。当线程 处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间片。直到线 程重新进入了就绪状态,它才有可能执行操作。 4.?死亡(Dead):处于死亡或终止状态的线程将不再是可调度的,并且再也不 会得到CPU时间,它的任务已经结束,或不再是可运行的。任务死亡的通常方式 是从run()方法返回,但是任务的线程还可以不被屮断。 进入线程状态 而一个任务进入阻塞状态,可能由以下原因造成: 通过调用sleep(milliseconds)方法使任务进入休眠状态,在这种情况下, 任务在指定的时间内不会运行。 通过调用wait ()方法使线程挂起。直到线程得到了 notify ()或notifyAllO 消息(或者在JavaSE5的java. util, concurrent类库中等价的signal ()活 signalAHO消息),线程才会进入就绪状态。 任务在等待某个I/O操作完成。 任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一 个任务已经获取了这个锁。 在较早的代码中,也可能会看到用suspend()和resume()方法来阻塞和唤醒线 程,但是在Java新版木小这些方法被废弃了,因为它们可能导致死锁。stop() 方法也已经被废弃了,因为它不释放线程获得的锁,并且如果线程处于不一致的 状态,其他任务可以在这种状态2刘览并修改它们。 现在我们需要查看的问题是:冇事你希望能够终止处于阻塞状态的任务。如呆对 于阻塞装填的任务,你不能等待其到达代码中可以检查其状态值的某一点,因而 决定让它主动终止,那么你就必须强制这个任务跳出阻塞状态。 中断 止如你所想象的,在Runnable, run()方法的中间打断它,与到达程序员准备好 离开该方法的其他一些地方相比,要复杂得多。因为当你打断被阻塞的任务时, 可能需要清理资源。正因为这一点,在任务的run()方法屮间打断,更像是抛出 的异常,因此在Java线程中的这种类型的异常中断中用到了异常。为了在以这 种方式终止任务吋返冋良好的状态,你必须仔细考虑代码的执行路径,并仔细编 写catch字句以便正确的清楚所有事物。 Thread类包含了 interrupt ()方法,因此你可以终止被阻塞的任务,这个方法将 设置线程的屮断状态。如果一个线程已经被阻塞,或者试图执行一个阻塞操作, 那么设置这个线程的中断状态将抛出InterruptedExceptiono当抛出该异常或 者该任务调用Thread, interrupted ()吋,【I【断状态将被复位。正如你将看到的, Thread, interrupted ()提供了离开run ()循环而不抛出异常的第二种方式。 为了调用interrupt (),你必须持有Thread对彖。你可能已经注意到了,新的 concurrent类库似乎在避免对Thread对象上的直接操作,转而尽量的通过 Executor來执行所有操作。如果你在Executor上调用shutdownNowO ,那么它 将发送一个interrupt ()调用给它启动的线程。这么做是有意义的,因为当你完 成工程中的某个部分或者整个程序时,通常会希望同时关闭某个特定Executor 的所有任务。然而,你有时也会希望只中断某个单一?任务。如果使用Executor, 那么通过调用submit ()方法而不是execute ()方法来启动任务,就可以持右该任 务的上下文。submit ()将返冋一个泛型Future?,其中有一个未修饰的参数, 因为你永远都不会在其上调用get()——持有这种Future的关键在于你可以在 其上调用cancel 0,并因此可以使用它来中断某个特定任务。如果你将true传 递给cancel (),那么它就会拥有在该线程上调用interrupt ()以停止这个线程的 能力。因此,cancel是一种中断由Executor启动的单个线程的方式。 下面的示例使用Executor展示了基本的interrupt ()用法: import java. io. IOException; import java. io. Tnput

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档