Предполагая, что у меня есть настройка ForkJoinPool со степенью параллелизма n, и что я вызываю параллельные вычисления следующим образом:
workpool.submit(
() -> {
objects.values().parallelStream().forEach(obj -> {
obj.foo();
});
});
Я делаю это для того, чтобы созданные там потоки создавались внутри рабочего пула (у меня есть разные компоненты системы, которые нужно изолировать). Теперь предположим, что поток, в котором это вызывается, также выполняется внутри этого рабочего пула, и я делаю:
Future<?> wait = workpool.submit(
() -> {
objects.values().parallelStream().forEach(obj -> {
obj.foo();
});
});
wait.get()
1) Блокирую ли я поток в ForkJoinPool? Если бы я заблокировал все n потоков на фьючерсах при попытке запланировать задачу в рабочем пуле, привело бы это к взаимоблокировке? Мне не ясно, означает ли "максимальная степень параллелизма" в ForkJoinPool, что (при наличии n неблокированных задач) всегда будет выполняться n потоков, или существует фиксированное число потоков, независимо от того, есть заблокированы. Что, если я использую wait.join() вместоwait.join
вместо этого (мне не нужны проверенные исключения, так как любое исключение, созданное в этом коде, уже будет генерировать исключение времени выполнения. Если я правильно понимаю, join() позволит потокам выполнять задачи в очереди во время ожидания)
2) Я все еще получаю преимущество от облегченных задач forkjoin параллельного потока, если я создаю исполняемый класс «оболочки», выполняя () -> {}
3) Есть ли какие-либо недостатки/преимущества в использовании этого вместо этого (при условии, что .join() действительно реализует поведение кражи работы, которое, как я думаю, оно делает):
CompletableFuture.supplyAsync(this::mylambdafunction, workpool)
.thenAccept(this::mynextfunction);