gpt4 book ai didi

java - CountdownLatch 结合了await(maxTime) 和countdown()

转载 作者:行者123 更新时间:2023-12-01 05:50:15 26 4
gpt4 key购买 nike

我有几个线程运行了几乎无限的时间和迭代次数。当找到最佳解决方案时,迭代计数将重置为 0。设置最大迭代次数以防止无限循环。

当所有线程达到最大迭代次数时,我使用倒计时锁存器来停止进程。换句话说,当一个线程达到最大迭代次数时,它会使用 notifyThreadStop() 通知我的主线程,当所有线程停止时,会触发 countdown()。

注意:我的线程在固定线程池 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() ,简单地说,将我的可运行对象中的 iterationCounter 设置为 MaxIterationCount 。

因此 (1) 将变为

    for(Runnable runner: r){
if(r.getIsRunning()){r.requestTermination();}
}
(2)

现在,我需要再次等待,直到所有线程真正停止,然后才能继续......嗯,只是想我可以有一个额外的锁存器并使用它。

因此 (2) 将变为

    mylatch2.await();
myExecutorService.shutdownNow();

当然,我的函数 notifyThreadStop() 需要对其进行修改,并且需要一个标志告诉它在 mylatch2 而不是 mylatch 上执行 countdown()。

我想我刚刚回答了我的问题,但既然所有这些都已经写下来,我将把它留在这里供其他人引用。

现在的问题是:有更好的方法来处理这个问题吗? (1) 或 (2) 中的 shutdownNow() 是唯一需要的吗? 知道我的线程必须在退出之前关闭自己的日志文件并关闭其内部可调用线程*ss*。

最佳答案

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

只要任务可以中断并在中断时正确关闭所有资源,就不会有问题。 (如果有问题,这是您的任务代码中的错误,您应该修复)

关于java - CountdownLatch 结合了await(maxTime) 和countdown(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4898961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com