java中如何终止线程

在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方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值