我有一个线程休眠一段时间并连续进行一些工作。
public void run() {
while(true) {
try {
Thread.sleep(SOME_RANDOM_TIME);
} catch (InterruptedException e) {
return;
}
doSomeLabour();
}
}
我有一堆在Executors
上运行的线程。当我在执行程序上调用shutdownNow
时,线程有时不会终止。 shutdownNow
所做的只是在所有正在运行的线程上调用interrupt
,并且不接受任何新线程。
所以,基本上,我只是中断所有线程。
我了解,当thread不在睡眠中并且被中断时,我的代码不会发生任何事情;但是,在完成工作之后,由于仍在该线程上设置了中断标志,因此下次线程尝试进入睡眠状态时,sleep(..)
是否应在下一次抛出InterruptedException
?
怎么样
while(!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(SOME_RANDOM_TIME);
} catch (InterruptedException e) {
return;
}
doSomeLabour();
}
代替?
Thread.interrupt()
的JDK Javadoc状态:
如果此线程在调用wait(),wait(long), 或Object类或join()的wait(long,int)方法, join(long),join(long,int),sleep(long)或sleep(long,int),方法 此类,则将清除其中断状态并将其 收到InterruptedException。
因此sleep()本身不会引发InterruptedException,而如果线程当前正在睡眠,则中断器会抛出InterruptedException。