Java怎样中断一个运行中的线程 - 编程入门网
op = true; Thread.sleep( 3000 ); System.out.println( "Stopping
application..." ); //System.exit( 0 ); } public void run() { while (
!stop ) { System.out.println( "Thread is running..." ); long time =
System.currentTimeMillis(); while ( (System.currentTimeMillis()-time < 1000)
&& (!stop) ) { } } System.out.println( "Thread exiting under
request..." ); }}
Java怎样中断一个运行中的线程(3)时间:2011-08-18运行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 Cclass Example3 extends Thread { volatile boolean stop = false; public static void main( String args[] ) throws Exception { Example3 thread = new Example3(); System.out.println( "Starting thread..." ); thread.start(); Thread.sleep( 3000 ); System.out.println( "Asking thread to stop..." ); thread.stop = true;//如果线程阻塞,将不会检查此变量 thread.interrupt(); Thread.sleep( 3000 ); System.out.println( "Stopping application..." ); //System.exit( 0 ); } public void run() { while ( !stop ) { System.out.println( "Thread running..." ); try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { System.out.println( "Thread interrupted..." ); } } System.out.println( "Thread |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |