我有一个Runnable
实施类,它将从Executors.newFixedThreadPool
运行
在Runnable
内,我有一个无限循环运行,它在UDP端口上侦听传入数据。
我希望优雅地结束Runnable
以关闭所述UDP端口。
我怎样才能做到这一点?
当直接扩展Thread
时,我可以访问interrupt()和isInterupted()等,我可以在其上建立无限循环。
然而,在Runnable
实施课程中,我想做一些像
@Override
public void run() {
while (active) {
}
}
并且
private boolean active = true;
如何在ThreadPool终止时设置active = false?
答案 0 :(得分:8)
您可以使用静态方法Thread.interrupted()
访问当前线程的中断标志,例如而不是使用active
标志:
public void run() {
try {
// open your ports
while (!Thread.interrupted()) {
// do stuff
}
} finally {
// close your ports in finally-block
// so they get closed even on exceptions
}
}
如果您要关闭ExecutorService
,请在其上拨打shutdownNow()
。这将interrupt()
任何正在运行的工作线程,并让您的Runnable
突破其循环。
答案 1 :(得分:2)
如果你在提交任务时获得了未来,你可以cancel(boolean)
未来,如果你传递了真正运行任务的线程将被中断
@Override
public void run() {
try{
while (!Thread.interrupted()) {
if(Thread.interrupted())return;//to quit from the middle of the loop
}
}finally{
//cleanup
}
}
请注意,每次出现InterruptedException时,您都必须使用Thread.currentThread().interrupt();
重置已中断的标志
答案 2 :(得分:1)
你可以用这个
while (!executor.isShutdown) {
//do your job
}
或在while循环中使用AtomicBoolean
。 (优先于volatile
)
如果要从stopProcessing()
答案 3 :(得分:1)
我建议不要使用'Runnable',而是覆盖'FutureTask'并实现它的'done'和'cancel'(如果需要)方法 - 你可以在那里进行所有必要的清理操作。
编辑:
忘了“取消”方法。