快速业务通道

Java怎样中断一个运行中的线程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号