当前位置: 首页 > 知识库问答 >
问题:

等待一个线程池中所有工作者完成的最佳方法是什么?

夹谷星纬
2023-03-14

假设我有以下代码:

final ExecutorService threadPool = Executors.newFixedThreadPool(
    NUMBER_OF_WORKERS);

for (int i=0; i < NUMBER_OF_WORKERS; i++)
{
  final Worker worker = new BirthWorker(...);
  threadPool.execute(worker);
}

现在我需要一段代码,它等待,直到所有的工人完成了他们的工作。

我知道的选项:

>

  • while(!ThreadPool.Isterminated()){}
  • 这样修改代码:

    final List futures=new ArrayList(NUMBER_OF_WORKERS);final ExecutorService threadPool=executors.newfixedThreadPool(NUMBER_OF_WORKERS);

    对于(int i=0;i

    对于(final Future Future:futures){Future.get();}

    //当我们到达这里时,所有工人都被保证完成了他们的工作。

    等待所有工人完成的最佳实践是什么?

  • 共有1个答案

    华景明
    2023-03-14

    我建议您使用CountDownLatch(假设这是一次活动),在构造函数中,您可以指定要等待多少个线程,并共享该实例,然后使用Awaitapi(使用超时或完全阻塞)和线程调用CountDownapi来等待所有线程完成。

    另一个选择是,如果您有权访问您希望完成的每个线程,则调用线程中的join方法以等待它们的完成。

     类似资料:
    • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,

    • 问题内容: 有时我需要等待一种方法完成,主要是在“加载程序”功能上。这是我这样做的方式: 我忍不住觉得这不是等待a 完成的最佳方法。做这个的最好方式是什么? 问题答案: 如果内没有 异步 代码, 则不是异步代码,例如以下代码: 完成后,您将看到警报。 否则(您内部有异步的东西),可以将循环包装在Promise中: 信用:@ rolando-benjamin-vaz-ferreira

    • 我有一个生产者-消费者模式的多线程任务。可能有许多生产者和一个消费者。我使用ArrayBlockingQueue作为共享资源。 Producer类中的run()方法: Consumer类中的run()方法: main()方法: 现在,当队列为空时,我有消费者结束条件。但是可能会有一段时间队列变成空的,但是一些生产者线程仍然在工作。所以我只需要在完成所有生产者线程之后才完成消费者线程(但它们的数量事

    • 这可能是在类似的背景下问的,但我在搜索了大约20分钟后找不到答案,所以我会问。 我已经编写了一个Python脚本(比如说:scriptA.py)和一个脚本(比如说scriptB.py) 在scriptB中,我想用不同的参数多次调用scriptA,每次运行大约需要一个小时,(这是一个巨大的脚本,做了很多事情……不用担心),我希望能够同时使用所有不同的参数运行scriptA,但我需要等到所有参数都完成

    • 问题内容: 我正在编写一个具有5个线程的应用程序,这些线程可以同时从Web获取一些信息,并在缓冲区类中填充5个不同的字段。 当所有线程完成其工作时,我需要验证缓冲区数据并将其存储在数据库中。 我该怎么做(当所有线程完成工作时收到警报)? 问题答案: 我采用的方法是使用管理线程池。

    • 我正在使用Spring 4.3.8。发布Java7。我想创建一个线程工厂来帮助管理应用程序中的某些工作人员。我像这样声明我的线程工厂 但是,我在线程上“加入”有困难。也就是说,我想在继续某个任务之前等待所有工作完成,所以我有 我的线程池是这样执行的 然而打印出来的是 所以很明显我没有等待。等待我的线程完成工作的正确方法是什么?