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

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

ID:30922528

大小:76.00 KB

页数:7页

时间:2019-01-04

终止阻塞的线程-编程开发技术_第1页
终止阻塞的线程-编程开发技术_第2页
终止阻塞的线程-编程开发技术_第3页
终止阻塞的线程-编程开发技术_第4页
终止阻塞的线程-编程开发技术_第5页
资源描述:

《终止阻塞的线程-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、终止阻塞的线程-编程开发技术终止阻塞的线程原文出处:摆渡者线程状态我们知道,一个线程可以处于以下四种状态Z-:1・?新建(New):当线程被创建时,它只会短暂地处于这种状态。此时它已经分配了必须的系统资源,并执行了初始化。此刻线程已经有资格获取CPU时间了,之后调度器将把这个线程转变为可运行状态或阻塞状态。2.?就绪(Runnable):在这种状态下,只要调度器将CPU吋间片分给线程,线程就可以运行。也就是说,在任意时刻,线程可以运行也可以不运行。3・?阻塞(Blocked):线程能够运行,但有某个

2、或多个条件阻止它运行。当线程处于阻塞状态时,调度器将忽略线程,不会分配给线程任何CPU时间片。直到线程重新进入了就绪状态,它才有可能执行操作。4.?死亡(Dead):处于死亡或终止状态的线程将不再是可调度的,并且再也不会得到CPU时间,它的任务已经结束,或不再是可运行的。任务死亡的通常方式是从run()方法返回,但是任务的线程还可以不被屮断。进入线程状态而一个任务进入阻塞状态,可能由以下原因造成:1.通过调用sleep(milliseconds)方法使任务进入休眠状态,在这种情况下,任务在指定的时间

3、内不会运行。2.通过调用wait()方法使线程挂起。直到线程得到了notify()或notifyAllO消息(或者在JavaSE5的java.util,concurrent类库中等价的signal()活signalAHO消息),线程才会进入就绪状态。3.任务在等待某个I/O操作完成。4.任务试图在某个对象上调用其同步控制方法,但是对象锁不可用,因为另一个任务已经获取了这个锁。在较早的代码中,也可能会看到用suspend()和resume()方法来阻塞和唤醒线程,但是在Java新版木小这些方法被废弃了

4、,因为它们可能导致死锁。stop()方法也已经被废弃了,因为它不释放线程获得的锁,并且如果线程处于不一致的状态,其他任务可以在这种状态2刘览并修改它们。现在我们需要查看的问题是:冇事你希望能够终止处于阻塞状态的任务。如呆对于阻塞装填的任务,你不能等待其到达代码中可以检查其状态值的某一点,因而决定让它主动终止,那么你就必须强制这个任务跳出阻塞状态。中断止如你所想象的,在Runnable,run()方法的中间打断它,与到达程序员准备好离开该方法的其他一些地方相比,要复杂得多。因为当你打断被阻塞的任务时,

5、可能需要清理资源。正因为这一点,在任务的run()方法屮间打断,更像是抛出的异常,因此在Java线程中的这种类型的异常中断中用到了异常。为了在以这种方式终止任务吋返冋良好的状态,你必须仔细考虑代码的执行路径,并仔细编写catch字句以便正确的清楚所有事物。Thread类包含了interrupt()方法,因此你可以终止被阻塞的任务,这个方法将设置线程的屮断状态。如果一个线程已经被阻塞,或者试图执行一个阻塞操作,那么设置这个线程的中断状态将抛出InterruptedExceptiono当抛出该异常或者该

6、任务调用Thread,interrupted()吋,【I【断状态将被复位。正如你将看到的,Thread,interrupted()提供了离开run()循环而不抛出异常的第二种方式。为了调用interrupt(),你必须持有Thread对彖。你可能已经注意到了,新的concurrent类库似乎在避免对Thread对象上的直接操作,转而尽量的通过Executor來执行所有操作。如果你在Executor上调用shutdownNowO,那么它将发送一个interrupt()调用给它启动的线程。这么做是有意义

7、的,因为当你完成工程中的某个部分或者整个程序时,通常会希望同时关闭某个特定Executor的所有任务。然而,你有时也会希望只中断某个单一•任务。如果使用Executor,那么通过调用submit()方法而不是execute()方法来启动任务,就可以持右该任务的上下文。submit()将返冋一个泛型Future,其中有一个未修饰的参数,因为你永远都不会在其上调用get()——持有这种Future的关键在于你可以在其上调用cancel0,并因此可以使用它来中断某个特定任务。如果你将true传递给c

8、ancel(),那么它就会拥有在该线程上调用interrupt()以停止这个线程的能力。因此,cancel是一种中断由Executor启动的单个线程的方式。下面的示例使用Executor展示了基本的interrupt()用法:importjava.io.IOException;importjava.io.TnputStream;importjava.util,concurrcnt.ExecutorScrvicc;importjava・util,concurrent.E

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。