为了账号安全,请及时绑定邮箱和手机立即绑定

主线程等待两个并行子线程java

主线程等待两个并行子线程java

慕妹3242003 2024-01-17 21:10:01
首先我想做的是:在主线程执行期间,我想暂停主线程并启动两个并行线程。一旦这两个并行线程终止,我想再次从主线程开始。我尝试过的:    ...    ...    main thread is executing    ...    ...CyclicBarrier barrier = new CyclicBarrier(2);Thread child1 = new Thread(new ThreadBuilderTask(barrier,0));Thread child2 = new Thread(new ThreadBuilderTask(barrier,1));child1.start();child2.start(); /* Now i'm expecting that child1 and child2 are running in parallel calling their fooFunction */child1.join();child2.join(); /*Now i'm expecting that main thread will wait for child1and also for child2 (that are running in parallel).*/... main thread starts again after both child1 and child2 finished (reached the await of the barrier) ... (break point set here, never reached)...线程生成器自定义类public class ThreadBuilderTask implements Runnable{    private CyclicBarrier barrier;    private int index;    ...setters and getters..    @Override    public void run() {        fooFunction(this.getIndex());        try {            this.getBarrier().await();        } catch (InterruptedException | BrokenBarrierException e) {            return;        }    }    public ThreadBuilderTask(CyclicBarrier barrier,int index){      this.barrier = barrier;      this.index = index;    }    public fooFunction(int index){        //Something taking some seconds to execute    }目前尚不清楚这里发生了什么,但它肯定不起作用。一旦我调用 join 一切都会停止并且主线程永远不会重新启动。(我在连接后放置了一个断点,以查看主线程何时重新启动)。也许这些概念有些混乱,而且我不确定是否需要同时使用屏障和连接,或者仅使用其中一种技术。
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

正如评论中提到的,我还建议使用CompletableFuture. 您所描述的要求的一个非常基本的示例可能如下所示:


final Runnable runnable1 = ...;

final Runnable runnable2 = ...;


CompletableFuture<Void> future1 = CompletableFuture.runAsync(runnable1);

CompletableFuture<Void> future2 = CompletableFuture.runAsync(runnable2);


CompletableFuture.allOf(future1, future2).get(); // waits for both runnables to finish

您可能想为此示例添加更多/一些异常处理。但它应该让我们了解这是如何运作的。


查看完整回答
反对 回复 2024-01-17
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您可以考虑使用 Java CompletableFuture来实现该目标。

使用其诸如SupplyAsyncrunAsync之类的函数,您可以启动子线程并最终连接它们各自的结果。或者您可以简单地让主线程等待,直到后续线程完成。

最近,我设法使用同一个类实现了一个示例分散-聚集函数。

查看完整回答
反对 回复 2024-01-17
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信