使用parallelStream,主线程会等待这些线程执行完吗,怎么等待所有线程完成,举出例子详细说明
时间: 2024-10-13 16:15:32 浏览: 29
Java多线程--等待所有子线程执行完的五种方法.docx
`parallelStream()` 是Java Stream API提供的并行处理功能,它会将数据分片并发地执行操作。当调用这个方法时,主线程并不会直接阻塞等待每个线程执行完毕,而是创建了一个任务池来执行计算。这些子任务是异步执行的,因此主线程可以继续做其他事情。
如果你想要在所有子线程完成后获取结果,你可以使用 `collect()` 或 `forEach()` 等需要返回值的操作,它们会自动等待所有子线程完成再返回结果。例如:
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int[] sumResult = numbers.parallelStream()
.mapToInt(Integer::intValue) // 将stream转换为Int流,然后映射到整数数组
.sum(); // 这一行会阻塞直到所有元素都被加总
// 或者如果你想对每个元素执行某种操作后等待结果,可以这样:
numbers.parallelStream()
.forEach(i -> System.out.println("Processing " + i)); // 输出的同时不会阻塞
System.out.println("All tasks finished!"); // 主线程在这里等待所有任务结束后打印
```
如果你确实想在所有线程都执行完后再执行特定代码,可以考虑使用 `CompletableFuture` 或者 `CountDownLatch` 来同步:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
public class Main {
private final CountDownLatch latch = new CountDownLatch(numbers.size());
public void processAndSignal(int number) {
// ... 实现你的业务逻辑
latch.countDown(); // 当线程处理完后,减少计数器
}
public void waitUntilDone() throws InterruptedException {
latch.await(); // 主线程在此处阻塞,直到所有任务完成
}
public static void main(String[] args) {
List<Integer> numbers = ...;
numbers.forEach(Main::new).forEach(main -> main.processAndSignal);
try {
Main main = new Main();
main.waitUntilDone();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在这个例子中,`processAndSignal` 方法处理完一个元素后会通过 `countDown()` 减少计数器,而 `waitUntilDone` 方法则会阻塞直到所有计数器都被减少。
阅读全文