【发布时间】:2011-02-04 14:16:07
【问题描述】:
我有几个线程运行几乎无限的时间和迭代次数。当找到最佳解决方案时,迭代计数将重置为 0。设置最大迭代次数以防止无限循环。
当所有线程都达到最大迭代次数时,我使用倒计时锁来停止进程。换句话说,当一个线程达到最大迭代次数时,它会使用 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 中将迭代计数器设置为 MaxIterationCount。
所以 (1) 会变成
for(Runnable runner: r){
if(r.getIsRunning()){r.requestTermination();}
}
(2)
现在,我需要再次等待,直到所有线程真正停止,然后才能继续....嗯,我只是想我可以有一个额外的锁存器并使用它。
所以 (2) 会变成
mylatch2.await();
myExecutorService.shutdownNow();
当然,我的函数 notifyThreadStop() 需要对其进行修改,并且需要一个标志告诉它在 mylatch2 上而不是 mylatch 上执行 countdown()。
我想我刚刚回答了我的问题,但既然所有这些都已经写完,我将把它留在这里供其他人参考。
现在的问题是:有更好的处理方法吗? (1) 或 (2) 中的 shutdownNow() 是唯一需要的吗? 知道我的线程必须在退出之前关闭它们自己的日志文件并关闭它们内部的 Callable thread*ss*。
【问题讨论】:
标签: java timeout countdown executorservice countdownlatch