CountdownLatch结合await(maxTime)和countdown()

时间:2011-02-04 14:16:08

标签: java timeout countdown executorservice countdownlatch

我有几个线程运行几乎无限的时间和迭代次数。当找到最佳解决方案时,迭代计数重置为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 *。

2 个答案:

答案 0 :(得分:0)

如果你使用shutdownNow()和awaitTernimation(),这将中断所有正在运行的任务并等待它们完成。

如果任务可以被中断并在中断时关闭所有资源,那么应该没有问题。 (如果出现问题,这是您应该修复的任务代码中的错误)

答案 1 :(得分:0)

  

我想我刚刚回答了我的问题,但因为所有这些都已经写好了

确实如此:-)如果要添加一件事是你应该小心使用RuntimeExceptions,否则你的shutdownNow()可能永远不会被调用。但你已经知道了,对吧?