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会说:“启动一个有序的关机,在这个关机中执行以前提交的任务,但不会接受新任务。”这会在内部中断所有空闲线程。所以我猜这将等待内部所有线程的终止。