停止无限循环Runnable从ThreadPool运行

时间:2011-08-24 13:16:17

标签: java multithreading threadpool

我有一个Runnable实施类,它将从Executors.newFixedThreadPool运行 在Runnable内,我有一个无限循环运行,它在UDP端口上侦听传入数据。

我希望优雅地结束Runnable以关闭所述UDP端口。

我怎样才能做到这一点? 当直接扩展Thread时,我可以访问interrupt()和isInterupted()等,我可以在其上建立无限循环。

然而,在Runnable实施课程中,我想做一些像

这样的事情
@Override
public void run() {
    while (active) {

    }
}

并且

private boolean active = true;

如何在ThreadPool终止时设置active = false?

4 个答案:

答案 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'(如果需要)方法 - 你可以在那里进行所有必要的清理操作。

编辑:

忘了“取消”方法。