我有几个线程运行几乎无限的时间和迭代次数。当找到最佳解决方案时,迭代计数重置为0。设置最大迭代次数以防止无限循环。
当所有线程都达到最大迭代次数时,我使用countdownlatch来停止进程。换句话说,当一个线程达到最大迭代次数时,它会使用 notifyThreadStop()通知我的主线程,当所有线程都停止时,它会触发countdown()。
注意:我的线程在FixedThreadPool ExecutorService内运行。
我想添加一个maxTime锁存器。所以我做的是以下
List<Runnable> r = .... //(contains all my runnables)
myExecutorService.invokeAll(r);
if(maxtime > 0){
mylatch.await(maxTime,TimeUnit.Seconds);
(1)
do stuff...
exit;
}
else{
mylatch.await();
myExecutorService.shutdownNow();
do stuff...
exit;
}
现在,我知道如果倒计时触发了锁存器,则表示所有线程都已停止,因此我可以关闭现在的ExecutorService。
达到最大时间时并非如此。所以在(1)中我想迭代所有我的跑步者以文明的方式终止他们:-)。为此,我定义了一个函数requestTermination(),简单地说,在我的runnables中将iterationCounter设置为MaxIterationCount。
所以(1)将成为
for(Runnable runner: r){
if(r.getIsRunning()){r.requestTermination();}
}
(2)
现在,我需要再次等待,直到所有线程都真正停止才能继续......嗯,我想我可以有一个额外的闩锁并使用它。
所以(2)将成为
mylatch2.await();
myExecutorService.shutdownNow();
当然,我的函数 notifyThreadStop()需要对其进行修改,并且需要一个标志告诉它在mylatch2上执行倒计时()而不是mylatch。
我想我刚刚回答了我的问题,但由于所有这些都已写完,我会留在这里供其他人参考。
现在的问题是:有什么更好的方法可以解决这个问题吗? (1)或(2)中的shutdownNow()是否是唯一需要的东西? 知道我的线程必须关闭自己的日志文件并在退出之前关闭其内部Callable线程* ss *。
答案 0 :(得分:0)
如果你使用shutdownNow()和awaitTernimation(),这将中断所有正在运行的任务并等待它们完成。
如果任务可以被中断并在中断时关闭所有资源,那么应该没有问题。 (如果出现问题,这是您应该修复的任务代码中的错误)
答案 1 :(得分:0)
我想我刚刚回答了我的问题,但因为所有这些都已经写好了
确实如此:-)如果要添加一件事是你应该小心使用RuntimeExceptions,否则你的shutdownNow()可能永远不会被调用。但你已经知道了,对吧?