应该使用isInterrupted()方法停止Thread的run方法中的while循环

时间:2015-08-09 15:37:49

标签: java multithreading

使用Thread的isInterrupted()方法在其run方法中通过从外部调用其interrupt()方法来结束while循环是一种好习惯。

public class ThreadManager{
    ...
    ...
    Thread t;
    public void init(){
      t = new MyThread();
      t.start();
    }

    .....
    public void stopProcessing(){
      t.interrupt();
    }
}

public class MyThread extends Thread{

     public void run(){

           while( !isInterrupted()){
              try{
                  //.. some process in a loop
              }catch(InterruptedException e){
                 // now stop running and end run method
              }
           }


     }

}

2 个答案:

答案 0 :(得分:4)

基本上在大多数情况下,是的。在{while}循环中使用InterruptedException作为条件是一种很好的做法,但这通常不是您需要做的全部。

在许多情况下,您还需要捕获interrupt(),表示Thread.sleep()被调用。其中一种情况可能是在循环中使用break。如果线程正在休眠或等待,则必须捕获此异常。您可以在catch块中使用例如public void run() { while(!isInterrupted()) { try { ... sleep(1000L); } catch (InterruptedException ex) { break; } } }

author.json

答案 1 :(得分:1)

这可能是一个意见问题。在我的意见(以及它的全部内容)中,是的,使用中断作为发出线程关闭信号的方法是个好主意。

我很少能够编写任何应用程序的顶级。我写了库代码。我总是认为interrupt()意味着我的代码应该优雅地中止它所要做的任何事情,但它应该准备好以防顶级应用程序要求它在之后再做一些事情。

如果我的代码创建了一个线程,并且线程中发生了中断,我就会中止"通过让线程自行关闭,但我确保我的代码可以在需要时重新创建线程。

这样,如果顶级应用程序的设计者希望interrupt()表示,"关闭应用程序,"我的代码将适用于此;但如果顶级应用程序的设计者希望它意味着不同的东西(例如,中止当前命令,并提示用户注意另一个),那么我的代码也可以使用它。