停止无限循环从ThreadPool运行Runnable运行

问题描述:

我有一个Runnable实现类将运行从Executors.newFixedThreadPoolRunnable内,我有一个无限循环运行,它监听UDP端口上的传入数据。停止无限循环从ThreadPool运行Runnable运行

我想优雅地结束Runnable为了关闭所述UDP端口。

我该如何做到这一点? 当直接扩展Thread时,我可以访问interrupt()和isInterupted()等,我可以基于此无限循环。

Runnable实现类然而,我想要做这样的事情

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

    } 
} 

,并有

private boolean active = true; 

如何设置激活=当线程池被终止假的?

+0

你的线程池中只有这种Runnable? –

+0

是的。还有什么其他类型的RUnnable? – chzbrgla

+0

哈哈! Sry,我的英语很差..无论如何,我想知道你提交给你游泳池的所有物体是否是同一个班级。或者实现一个通用接口(Runnable除外)。 –

您可以使用静态方法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()

+0

所以我需要保持对执行者的引用。 以及当我关闭执行程序时发生了什么?它是否等待内部所有线程的终止?如果不是,执行者可能会终止并且(!executor.isShutdown)将不会被达到? – chzbrgla

+0

是的,你需要一个参考。如果你使用'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'并实现它'完成'和'取消'(如果需要)的方法 - 在那里你可以做所有必要的清理操作。

编辑:

忘了`取消'的方法。