检查线程是否中断?

时间:2013-05-01 18:58:17

标签: java multithreading interrupt

我只是想知道这个线程是否正在中断,如果我做得对吗? 如果我错了,请告诉我

public void run(){
  int i;
  while(!Thread.currentThread().isInterrupted()){
    for(i=1;i<=100;i++){

      System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i);

      if(i==3){
        Thread.currentThread().interrupt();
        gotoInform();
        break;
      }
      try{
        Thread.currentThread().sleep(1000);////to sleep the Thread for 1 Second (1000ms)
      }
      catch(Exception e){            
        System.out.printf("Error"+e);            
      }
    }
  }

3 个答案:

答案 0 :(得分:6)

这是错误的,因为如果sleep发现线程被中断,它将抛出InterruptedException 并清除中断的标志。然后吞下该异常,抑制该线程被中断的任何记录。相反,你应该写更多这样的东西:

public void run(){
    for(int i=1;i<=100;i++){

        System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i);

        if(i==3){
            Thread.currentThread().interrupt();
            gotoInform();
            break;
        }
        try{
            Thread.currentThread().sleep(1000);
        }
        catch(final Exception e){
            e.printStackTrace();
            if(e instanceof InterruptedException) {
                // just in case this Runnable is actually called directly,
                // rather than in a new thread, don't want to swallow the
                // flag:
                Thread.currentThread().interrupt();
            }
            return;
        }
    }
}

(注意:我假设这不是“真正的”代码,而是你只是想了解线程中断是如何工作的。在“真正的”代码中,你几乎不需要中断当前的以这种方式线程。)

答案 1 :(得分:1)

如前所述,线程中断本身是没有意义的(除非用于在捕获InterruptedException之后重新中断自身)。你在这里基本上使用线程的内部中断标志作为一个条件变量 - 虽然它可能起作用但它根本不应该用于什么,并且会让任何其他人感到困惑。需要阅读你的代码。如上所述使用循环计数器来使代码更清晰。

另外,您的陈述:

System.out.println("THREAD VALUE AFTER 1 SECOND IS: "+i);

是错误的,因为它将在第一次循环时立即执行(当时间接近零秒时)。

答案 2 :(得分:0)

  

我只是想知道这个线程是否在中断,如果我做得对吗?

@ruakh是正确的,一旦<{1}}被抛出,总是一个好主意重新中断一个线程。

但是,如果您的代码的目标是自我中断并且没有其他线程会中断正在运行的线程,那么您将永远不会进入InterruptedException调用,因为在线程之后调用了sleep()被打断了。

如果线程总是只是自我中断,那么我只会使用一个标志。类似的东西:

break;

即使您中断了自己的主题,也可以致电boolean done = false; while (!done) { ... if(i==3){ done = true; ... } } ,这可能会调用gotoInform()wait()本身并导致sleep()。您需要确保代码运行良好并重新中断线程,如果是这样。