Java 停止线程池中的无限循环可运行运行运行

Java 停止线程池中的无限循环可运行运行运行,java,multithreading,threadpool,Java,Multithreading,Threadpool,我有一个Runnable实现类,它将从执行器运行。newFixedThreadPool 在Runnable中,我运行了一个无限循环,它在UDP端口上侦听传入的数据 我想优雅地结束Runnable,以关闭上述UDP端口 我怎样才能做到这一点? 当直接扩展线程时,我可以访问interrupt()和isinterrupted()等,我可以在此基础上创建无限循环 然而,在Runnable实现类中,我想做如下事情 @Override public void run() { while (activ

我有一个
Runnable
实现类,它将从
执行器运行。newFixedThreadPool
Runnable
中,我运行了一个无限循环,它在UDP端口上侦听传入的数据

我想优雅地结束
Runnable
,以关闭上述UDP端口

我怎样才能做到这一点? 当直接扩展
线程
时,我可以访问interrupt()和isinterrupted()等,我可以在此基础上创建无限循环

然而,在
Runnable
实现类中,我想做如下事情

@Override
public void run() {
    while (active) {

    }
}
而且

private boolean active = true;
当线程池终止时,如何设置active=false?

您可以使用此选项

while (!executor.isShutdown) {
//do your job
}
或者在while循环中使用
AtomicBoolean
。(优于挥发性的)


如果您想手动停止处理,可以通过一些方法设置此标志,如
stopProcessing()

如果您在提交任务时获得了未来,则可以
取消(布尔)
如果您传递true,则任务正在运行的线程将被中断

@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”,并实现“done”和“cancel”(如果需要)方法,在这些方法中,您可以执行所有必要的清理操作

编辑:


忘记了“取消”方法。

您可以使用静态方法访问当前线程的中断标志,例如,使用以下方法代替
活动的
标志:

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
    }
}

当您想关闭
执行器服务时,请调用它。这将
interrupt()
任何正在运行的工作线程,并使您的
Runnable
中断其循环。

您的线程池中只有这种Runnable?是的。还有什么其他类型的RUnnable?哈哈!我的英语很差。。无论如何,我想知道提交到池中的所有对象是否都是同一个类。或者实现一个公共接口(而不是Runnable),所以我需要保留一个对调用执行器的引用。当我关闭遗嘱执行人时发生了什么?它是否等待内部所有线程的终止?如果没有,执行器可能会终止,并且(!executor.isshutton)将无法到达?是的,您需要一个引用。如果使用
executor.shutdown
,javadoc会说:“启动一个有序的关机,在这个关机中执行以前提交的任务,但不会接受新任务。”这会在内部中断所有空闲线程。所以我猜这将等待内部所有线程的终止。