停止无限循环从ThreadPool运行Runnable运行
我有一个Runnable
实现类将运行从Executors.newFixedThreadPool
在Runnable
内,我有一个无限循环运行,它监听UDP端口上的传入数据。停止无限循环从ThreadPool运行Runnable运行
我想优雅地结束Runnable
为了关闭所述UDP端口。
我该如何做到这一点? 当直接扩展Thread
时,我可以访问interrupt()和isInterupted()等,我可以基于此无限循环。
在Runnable
实现类然而,我想要做这样的事情
@Override
public void run() {
while (active) {
}
}
,并有
private boolean active = true;
如何设置激活=当线程池被终止假的?
您可以使用静态方法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
突破其循环。
您可以使用此
while (!executor.isShutdown) {
//do your job
}
或while循环使用AtomicBoolean
。 (最好超过volatile
)
该标志可以,如果你想停止手动处理,如stopProcessing()
所以我需要保持对执行者的引用。 以及当我关闭执行程序时发生了什么?它是否等待内部所有线程的终止?如果不是,执行者可能会终止并且(!executor.isShutdown)将不会被达到? – chzbrgla
是的,你需要一个参考。如果你使用'executor.shutdown',javadoc就会这样说:“启动一个有序的关闭,在其中执行先前提交的任务,但不会接受任何新任务。”在内部,这会中断所有的空闲线程。所以我想这会等待所有线程的终止。 –
如果你得到一个未来,当你提交你可以cancel(boolean)
未来的任务,如果你通过设置一些方法真正的任务正在运行的线程将被中断
@Override
public void run() {
try{
while (!Thread.interrupted()) {
if(Thread.interrupted())return;//to quit from the middle of the loop
}
}finally{
//cleanup
}
}
请注意,您必须将中断标志与Thread.currentThread().interrupt();
重置每次你得到一个抛出InterruptedException的
我建议不要使用'Runnable',而是覆盖'FutureTask'并实现它'完成'和'取消'(如果需要)的方法 - 在那里你可以做所有必要的清理操作。
编辑:
忘了`取消'的方法。
你的线程池中只有这种Runnable? –
是的。还有什么其他类型的RUnnable? – chzbrgla
哈哈! Sry,我的英语很差..无论如何,我想知道你提交给你游泳池的所有物体是否是同一个班级。或者实现一个通用接口(Runnable除外)。 –