首先我想做的是:在主线程执行期间,我想暂停主线程并启动两个并行线程。一旦这两个并行线程终止,我想再次从主线程开始。我尝试过的: ... ... 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
您可能想为此示例添加更多/一些异常处理。但它应该让我们了解这是如何运作的。
慕码人2483693
TA贡献1860条经验 获得超9个赞
您可以考虑使用 Java CompletableFuture来实现该目标。
使用其诸如SupplyAsync或runAsync之类的函数,您可以启动子线程并最终连接它们各自的结果。或者您可以简单地让主线程等待,直到后续线程完成。
最近,我设法使用同一个类实现了一个示例分散-聚集函数。
添加回答
举报
0/150
提交
取消