b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

java版本 停止Java线程,小心interrupt()方法(3)

电脑杂谈  发布时间:2018-02-09 15:33:02  来源:网络整理

????????????long??time??=??System.currentTimeMillis();????

????????????while??(??(System.currentTimeMillis()-time??<??1000)??&&??(!stop)??)??{????

????????????}????

对应java版本_java最新版本是多少_java版本

????????}????

??????System.out.println(??"Thread??exiting??under??request..."??);????

????}????

}????

运行Listing B中的代码将产生如下输出(注意线程是如何有秩序的退出的)??

Starting thread...??

Thread is running...??

Thread is running...??

Thread is running...??

Asking thread to stop...??

Thread exiting under request...??

Stopping application...??

???? 虽然该方法要求一些编码,但并不难实现。同时,它给予线程机会进行必要的清理工作,这在任何一个多线程应用程序中都是绝对需要的。请确认将共享变量定义成volatile 类型或将对它的一切访问封入同步的块/方法(synchronized blocks/methods)中。??

到目前为止一切顺利!但是,当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用Object.wait()、ServerSocket.accept()和DatagramSocket.receive()时,这里仅举出一些。??

他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。??

很不幸运,不存在这样一种机制对所有的情况都适用,但是,根据情况不同却可以使用特定的技术。在下面的环节,我将解答一下最普遍的例子。??

使用Thread.interrupt()中断线程??

?? 正如Listing A中所描述的,Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。??

?????? 因此,如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最后线程都将检查共享变量然后再停止。Listing C这个示例描述了该技术。??

Listing C??

class??Example3??extends??Thread??{????

????volatile??boolean??stop??=??false;????

????public??static??void??main(??String??args[]??)??throws??Exception??{????


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-69021-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...