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