让主线程实时等待ForkJoinPool中的子线程结束,请用最优雅的方式
时间: 2023-12-19 14:24:13 浏览: 225
主线程等待子线程结束
4星 · 用户满意度95%
我们可以使用`ForkJoinTask.join()`方法,该方法会阻塞当前线程直到对应的子任务执行完成。在主线程中,我们可以调用`ForkJoinTask.get()`方法获取到主任务的执行结果,然后在调用`join()`方法等待子任务执行完成。例如:
```java
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool();
MyTask task = new MyTask();
pool.execute(task);
// 等待所有子任务执行完成
task.join();
// 获取主任务的执行结果
int result = task.get();
System.out.println("主任务执行结果:" + result);
}
static class MyTask extends RecursiveTask<Integer> {
@Override
protected Integer compute() {
int sum = 0;
if (任务足够小) {
// 执行任务
} else {
// 拆分任务
MyTask subTask1 = new MyTask();
MyTask subTask2 = new MyTask();
invokeAll(subTask1, subTask2);
// 等待子任务执行完成
subTask1.join();
subTask2.join();
// 合并子任务结果
sum = subTask1.join() + subTask2.join();
}
return sum;
}
}
```
在上面的代码中,我们通过调用`task.join()`方法等待所有子任务执行完成,然后通过`task.get()`方法获取主任务的执行结果。这种方式不仅简洁优雅,而且非常高效,因为它充分利用了ForkJoin框架的并发能力。
阅读全文