gpt4 book ai didi

java多线程运行,当一个线程找到解决方案时停止线程

转载 作者:行者123 更新时间:2023-12-05 09:33:48 25 4
gpt4 key购买 nike

我在尝试停止运行多个线程的程序时遇到问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到解决方案,所有其他线程都将停止。

在 main 方法中,我创建了一个线程组,并使用 for 循环向其中添加线程并启动它们

ThreadGroup tg = new ThreadGroup("thread group");
Thread th;
for(int i = 0; i<4; i++){
th = new Thread(tg, new Runnable(), "Thread " + i)
th.start();
}

在实现 Runnable 的类中,我在尝试弄清楚如何实现它以便一旦其中一个线程找到解决方案时所有线程都将停止时遇到了麻烦。最终发生的是其他线程继续运行,有时线程会相互中断并相互覆盖。

最佳答案

你必须中断那些线程(并处理可运行的中断)。我也不确定您是否应该使用 ThreadGroup - 我记得看到过关于它们的 Sonar 警告。

您最好有一个 ExecutorService 并使用 CountDownLatch 执行此操作(这是执行此操作的一种方法):

ExecutorService es = Executors.newFixedThreadPool(100);
CountDownLatch cdl = new CountDownLatch(1);
for (int i = 0; i < 100; ++i) {
es.submit(() -> {
Thread.sleep(TimeUnit.SECONDS.toMillis(30)); // + exception handling
cdl.countDown();
});
}
cdl.await(); // or await(5, TimeUnit.MINUTES);
es.shutdownNow();

诀窍是:

  1. 您创建了一个包含 100 个线程的池的 ExecutorService
  2. 您创建一个 CoundDownLatch - 一个屏障 - 计数为 1。
  3. 您提交您的任务,当他们的工作完成时,调用 cdl.countDown(); 将计数器从 1 减少到 0。
  4. 父线程等待 CountDownLatch 减少到 0 - 您可能应该使用第二个版本(例如阻塞直到 5 分钟)。

如果所有 Runnable 都失败,您将不会得到结果:要么使用最长等待时间,要么您可以添加另一个 CountDownLatch,这次计数为100(线程数),try/finally中的countDown(),在另一个线程中,中断等待cdl的线程.您也可以循环执行此操作:

CountDownLatch allCdl = new CountDownLatch(100);

for (;allCdl.getCount() != 0;) {
if (!cdl.await(60, TimeUnit.SECONDS)) {
if (allCdl.getCount() == 0) {
break;
}
}
}

但是,getCount() 的 javadoc 提到此方法通常用于调试和测试目的。(参见 CyclicBarrier)。不确定这是否是正确的用法。

关于java多线程运行,当一个线程找到解决方案时停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67029562/

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