快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

Java怎样中断一个运行中的线程

时间:2011-08-18

程序是很简易的。然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决, 将导致意外的行为以及细微的、难以发现的错误。

在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程。

背景中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其 当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序。虽然初次看来 它可能显得简单,但是,你必须进行一些预警以实现期望的结果。你最好还是牢记以下的几点告诫。

首先,忘掉Thread.stop方法。虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是 不受提倡的,这意味着,在未来的JAVA版本中,它将不复存在。

一些轻率的家伙可能被另一种方法Thread.interrupt所迷惑。尽管,其名称似乎在暗示着什么,然而 ,这种方法并不会中断一个正在运行的线程(待会将进一步说明),正如Listing A中描述的那样。它创 建了一个线程,并且试图使用Thread.interrupt方法停止该线程。 Thread.sleep()方法的调用,为线 程的初始化和中止提供了充裕的时间。线程本身并不参与任何有用的操作。

  class Example1 extends Thread {      boolean stop=false;     

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

= new Example1();      System.out.println( "Starting thread..." );      

thread.start();      Thread.sleep( 3000 );      System.out.println( 

"Interrupting thread..." );      thread.interrupt();      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)) {      }      }      System.out.println

("Thread exiting under request..." );      }      }

Java怎样中断一个运行中的线程(2)

时间:2011-08-18

如果你运行了Listing A中的代码,你将在控制台看到以下输出:

Starting thread...Thread is running...Thread is running...Thread is 

running...Interrupting thread...Thread is running...Thread is 

running...Thread is running...Stopping application...Thread is 

running...Thread is running...Thread is 

running..................................

甚至,在Thread.interrupt()被调用后,线程仍然继续运行。

真正地中断一个线程

中断线程最好的,最受推荐的方式是,使用共享变量(shared variable)发出信号,告诉线程必须停 止正在运行的任务。线程必须周期性的核查这一变量(尤其在冗余操作期间),然后有秩序地中止任务。 Listing B描述了这一方式。

Listing Bclass Example2 extends Thread { volatile boolean stop = false;

 public static void main( String args[] ) throws Exception {  Example2 thread = new 

Example2();  System.out.println( "Starting thread..." );  thread.start();  

Thread.sleep( 3000 );  System.out.println( "Asking thread to stop..." );  

thread.st

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号