我有一个表单的处理循环
while (true) {
doWork();
Thread.sleep(SLEEP_INTERVAL);
}
我想从中做出一个Runnable
可以很好地使用并且在被调用ExecutorService
时会退出的东西。ExecutorService.shutdownNow()
我想这样写:
public WorkerTask implements Runnable
{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
doWork();
try {
Thread.sleep(SLEEP_INTERVAL);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
简单的测试表明它至少看起来可以工作,因为任务被中断并将退出并且ExecutorService
将关闭,并且无论中断doWork()
是在处理期间还是在sleep
. (通过改变工作量doWork()
和大小SLEEP_INTERVAL
,我几乎可以控制中断发生的位置)。
但是当我用谷歌搜索时,我看到了使用Thread.interrupted()
以及Thread.currentThread().isInterrupted()
. 我知道前者清除中断标志而后者离开它,但是我需要关心的还有其他区别吗?
我还看到Thread.currentThread().isInterrupted()
or的结果Thread.interrupted()
存储在volatile
变量中并且该变量用作while
循环测试条件的版本。这只是一种风格还是有必要这样做?在我所写的内容中,我必须担心以某种方式可以清除设置之间的中断标志(无论是在线程处于活动状态时被接收,还是通过我捕获InterruptedException
并重新设置标志)和何时Thread.currentThread().isInterrupted()
被调用循环测试?