2

我只是想知道如果我做得对,这个线程是否会中断?如果我错了,请给我提示

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);            
      }
    }
  }
4

3 回答 3

8

这是错误的,因为如果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;
        }
    }
}

(注意:我假设这不是“真实”代码,而是您只是想了解线程中断的工作原理。在“真实”代码中,您几乎不需要中断当前线程方式。)

于 2013-05-01T19:04:05.087 回答
1

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

另外,您的声明:

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

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

于 2013-05-01T19:14:49.157 回答
0

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

@ruakh 是正确的,一旦抛出线程重新中断总是一个好主意。InterruptedException

但是,如果您的代码的目标是自中断并且没有其他线程会中断正在运行的线程,那么您将永远无法sleep()调用,因为break;在线程被中断后调用。

如果线程总是只是自我中断,那么我只会使用一个标志。就像是:

boolean done = false;
while (!done) {
   ...
   if(i==3){
        done = true;
        ...
   }
}

即使你中断了你的线程,你也会调用gotoInform()which 可能会调用wait()orsleep()本身并导致InterruptedException. 您需要确保代码表现良好,如果是,则重新中断线程。

于 2013-05-01T19:09:36.503 回答