码迷,mamicode.com
首页 > 编程语言 > 详细

java中如何终止线程

时间:2015-07-22 20:57:08      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

在java早期的版本中,提供了一个终止线程的方法:stop()。但在随后的版本中,这个方法被遗弃了,因为它的中断是”立即“,这样有可能会造成数据不一致的情况。比如说在转账的过程中。因此在jdk1.5的时候,有一个方法出来解决这个问题:intertupt()。这个方法会在run()中止,【Interrupting a thread that is not alive need not have any effect.】,这样就不会造成数据不一致的问题。但是很多人在使用这个方法的时候还是出现了问题。以下举出一个例子:

public class ThreadTest extends Thread {
   int count=0;
   public void run(){
       System.out.println(getName()+"将要运行...");
       while(!this.isInterrupted()){
           System.out.println(getName()+"运行中"+count++);
           try{
               Thread.sleep(400);
           }catch(InterruptedException e){
               System.out.println(getName()+"从阻塞中退出...");
               System.out.println("this.isInterrupted()="+this.isInterrupted());

           }
       }
       System.out.println(getName()+"已经终止!");
   }
}

public class ThreadDemo {
    
    public static void main(String argv[])throws InterruptedException{
        ThreadTest ta=new ThreadTest();
        ta.setName("ThreadTest");
        ta.start();
        Thread.sleep(2000);
        System.out.println(ta.getName()+"将要被中断");
        ta.interrupt();
        System.out.println("ta.isInterrupted()="+ta.isInterrupted());
    }

}
以下给出运行结果:

技术分享

可见【中断】之后,程序还在继续运行着。为什么呢?sleep的时候,调用了interupt会抛出异常,让线程重新处于非中断状态。修复这个bug的方法是可以用一个标志位来解决。

public class ThreadTest extends Thread {
    private boolean isInterrupted=false;
     int count=0;
   
   public void interrupt(){
       isInterrupted = true;
       super.interrupt();
      }
   
   public void run(){
       System.out.println(getName()+"将要运行...");
       while(!isInterrupted){
           System.out.println(getName()+"运行中"+count++);
           try{
               Thread.sleep(400);
           }catch(InterruptedException e){
               System.out.println(getName()+"从阻塞中退出...");
               System.out.println("this.isInterrupted()="+this.isInterrupted());

           }
       }
       System.out.println(getName()+"已经终止!");
   }
}
这样就可以解决以上存在问题。 

注意:

当线程再读取大文件数据时,调用interrupt也是无效的。这个时候,我们也可以通过标志位,来解决。比如说中断的状态检测到了,我们就强制关闭流通过调用close方法。

版权声明:本文为博主原创文章,未经博主允许不得转载。

java中如何终止线程

标签:

原文地址:http://blog.csdn.net/asking1233/article/details/47008531

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!