猿问

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

首先我想做的是:


在主线程执行期间,我想暂停主线程并启动两个并行线程。一旦这两个并行线程终止,我想再次从主线程开始。


我尝试过的:


    ...

    ...

    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 一切都会停止并且主线程永远不会重新启动。(我在连接后放置了一个断点,以查看主线程何时重新启动)。


也许这些概念有些混乱,而且我不确定是否需要同时使用屏障和连接,或者仅使用其中一种技术。


慕妹3242003
浏览 107回答 2
2回答

胡子哥哥

正如评论中提到的,我还建议使用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您可能想为此示例添加更多/一些异常处理。但它应该让我们了解这是如何运作的。

慕码人2483693

您可以考虑使用 Java CompletableFuture来实现该目标。使用其诸如SupplyAsync或runAsync之类的函数,您可以启动子线程并最终连接它们各自的结果。或者您可以简单地让主线程等待,直到后续线程完成。最近,我设法使用同一个类实现了一个示例分散-聚集函数。
随时随地看视频慕课网APP

相关分类

Java
我要回答