使用parallelStream,主线程会等待这些线程执行完吗,怎么让所有线程执行完
时间: 2024-10-13 09:15:25 浏览: 7
`parallelStream()` 是 Java 8 引入的一种并行流处理机制,它将 Stream 序列分割成多个小任务,并在可用的处理器核心上并发地执行。主线程并不会阻塞等待所有子线程执行完成,因为它们是异步执行的。当并行流内部的操作完成后,通常会有最后的聚合操作(如 `collect` 或 `forEach` 等)来汇总结果,这个操作会在主线程中完成。
如果你想确保所有的任务都完成后才继续主线程的逻辑,你可以使用如下方法:
1. **使用 CompletionStage**:`parallelStream().map(...).thenApply(...)` 中,`.thenApply` 的部分会在所有任务完成后执行。这利用了 `CompletableFuture`,一个代表异步计算结果的接口。
```java
List<CompletionStage<String>> tasks = stream.parallel().map(...);
CompletableFuture.allOf(tasks.toArray(CompletableFuture[]::new))
.whenComplete((result, ex) -> {
if (ex != null) {
// 处理异常
} else {
// 所有任务完成后的操作
}
});
```
2. **使用 `countdownLatch` 或 ` Phaser`**:这些并发工具可以帮助你在所有子线程执行完毕后再进行下一步操作。例如,可以创建一个 CountDownLatch 来同步。
```java
CountDownLatch latch = new CountDownLatch(stream.size());
stream.parallel().forEach(item -> {
// ...业务操作
latch.countDown();
});
latch.await(); // 主线程阻塞直到所有任务完成
```
注意,在使用并行流时,过多的并行度可能会导致上下文切换频繁,反而降低效率,因此需要合理设置并行度。