等待 Java 线程池中的线程子集

发布于 2024-10-10 16:45:32 字数 311 浏览 5 评论 0原文

假设我有一个包含 X 项的线程池,并且给定任务使用这些项中的 Y(其中 YY 小得多) >X)。

我想等待给定任务(Y 项)的所有线程完成,而不是整个线程池。

如果线程池的 execute() 方法返回对所使用线程的引用,我可以简单地 join() 到这些 Y 线程中的每一个,但是事实并非如此。

有谁知道一种优雅的方法来实现这一点?谢谢。

Let's say I have a thread pool containing X items, and a given task employs Y of these items (where Y is much smaller than X).

I want to wait for all of the threads of a given task (Y items) to finish, not the entire thread pool.

If the thread pool's execute() method returned a reference to the employed thread I could simply join() to each of these Y threads, but it doesn't.

Does anyone know of an elegant way to accomplish this? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

野鹿林 2024-10-17 16:45:33

创建以 Y 作为计数的 CountDownLatch,并在每个 Y 任务中执行 latch.countDown()。最后,latch.await() 将确保所有 Y 任务都完成。

Create CountDownLatch with Y as count and do latch.countDown() in each of Y tasks. In the end latch.await() will ensure that all of the Y tasks are completed.

小ぇ时光︴ 2024-10-17 16:45:32

您可以使用 CyclicBarrier 并让每个线程仅在其类型为 Y 时等待。例如。

ExecutorService executor = Executors.newFixedThreadPool(X.size);

public void executeAllAndAwaitCompletion(List<? extends Y> myRunnableY){
   final CyclicBarrier barrier = new CyclicBarrier(myRunnable.size()+1);
   for(final Y y : myRunnableY){
       executor.submit(new Runnable(){
           public void run(){
                y.run();//for the sake of this example y has a run method
                barrier.await();
           }
       }); 
    }
   barrier.await();
}

因此,运行类型 Y 的每个线程都会等待,直到所有这些 Y 都完成。请注意,您必须将屏障大小加 1,以考虑到最初执行的线程也将等待。

另请注意:如果迈克尔·博格沃特的示例适合您,那就最好了。但是,如果您需要线程池,对于运行 Y 的每个线程不运行任何其他非 Y 线程,那么我的解决方案将是您可以做到这一点的唯一方法。 Future.get() 只会阻塞调用线程,当线程池完成 Y 的执行时,它将开始执行一些其他(可能是非 Y)任务。

You can use a CyclicBarrier and have each thread wait only when it is of type Y. For example.

ExecutorService executor = Executors.newFixedThreadPool(X.size);

public void executeAllAndAwaitCompletion(List<? extends Y> myRunnableY){
   final CyclicBarrier barrier = new CyclicBarrier(myRunnable.size()+1);
   for(final Y y : myRunnableY){
       executor.submit(new Runnable(){
           public void run(){
                y.run();//for the sake of this example y has a run method
                barrier.await();
           }
       }); 
    }
   barrier.await();
}

So each thread that is running type Y will wait until all those Y's have completed. Note you have to add 1 to the barrier size to account for the initially executing thread to wait also.

Also Note: If Michael Borgwardt's example works for you that would be best. However, if you need the thread pool, for each thread that is running Y to not run any other non-Y's then my solution would be the only way you can do it. Future.get() will only block the calling thread, and when the thread pool finishes Y's execution it will then pick up some other (possibly non-Y) task.

爱本泡沫多脆弱 2024-10-17 16:45:32

而不是 execute()ing Runnable,只需 invokeAll() 一些 Callable - 然后你为每个对象获取一个 Future,您可以在其上调用 get(),它会阻塞直到任务完成。

Instead of execute()ing Runnables, just invokeAll() some Callables - then you get a Future for each on which you can call get(), which blocks until the task is finished.

最美不过初阳 2024-10-17 16:45:32

您应该使用 CompletionService 正是用于此目的。

  • 创建 Executor
  • 使用 Executor 创建 ExecutorCompletionService 通过
  • CompletionService 提交任务
  • 使用 takepoll 在 CompletionService 上等待任务完成
  • 重复直到您提交的所有任务都完成
  • 完成

您可以与其他东西共享 Executor,只需在顶部创建 CompletionService 并将其用于您的特定任务任务。

You should use a CompletionService which is used for exactly this purpose.

  • Create Executor
  • Create ExecutorCompletionService using the Executor
  • Submit tasks via the CompletionService
  • Use take or poll on the CompletionService to wait for the tasks to finish
  • Repeat until all the tasks you submitted have finished
  • Done

You can share an Executor with something else, just create the CompletionService over the top and use it for your specific tasks.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文