假设我有一个并行度为 n 的 ForkJoinPool 设置,并且我将这样的并行计算称为:
workpool.submit(
() -> {
objects.values().parallelStream().forEach(obj -> {
obj.foo();
});
});
我这样做是为了确保在工作池中创建在那里生成的线程(我有需要隔离的系统的不同组件)。现在假设调用 this 的线程也在这个工作池中执行,我这样做:
Future<?> wait = workpool.submit(
() -> {
objects.values().parallelStream().forEach(obj -> {
obj.foo();
});
});
wait.get()
1) 我是否阻塞了 ForkJoinPool 中的线程?如果我让 n 个线程全部阻塞在 future 上,同时尝试在工作池中安排任务,这会导致死锁吗?我不清楚 ForkJoinPool 中的“最大并行度”是否意味着(如果有 n 个非阻塞任务),将始终有 n 个线程在执行,或者是否有固定数量的线程,无论是否有被封锁。如果我改用 wait.join() 会怎样wait.join
(我不需要检查异常,因为此代码中抛出的任何异常都已经生成运行时异常。如果我理解正确,join() 将允许线程在等待时执行排队的任务)
2) 如果我通过 () -> {} 创建一个可运行的“包装器”类,我是否还能从并行流的轻量级 forkjoin 任务中受益?
3)使用它是否有任何缺点/优点(假设 .join() 确实实现了我认为的工作窃取行为):
CompletableFuture.supplyAsync(this::mylambdafunction, workpool)
.thenAccept(this::mynextfunction);