Ответ 1
- Новые потоки появляются в пуле fork/join, когда он обнаруживает
что все потоки в пуле fork/join ждут друг друга
используя конструкцию
join
, и еще предстоит выполнить большую работу который мог бы закончить один из потоков. В качестве альтернативы, если один из потоковForkJoinWorker
выполняет код, который блокирует, кроме как с помощьюjoin
, он может уведомить пул, используяManagedBlocker
s. - Он потенциально применим к любым контекстам выполнения - он служит уведомлением о реализации
ExecutionContext
, что код, выполняемый рабочим потоком, потенциально блокирует какое-либо условие и что это условие может быть разрешено путем вычисления что-то другое, используя какой-то другой поток. Контекст выполнения может или не может действовать по этому поводу. В текущей (2.10, 2.11) реализацииblocking
будет работать только с глобальным контекстом выполнения по умолчанию. - Если вы завершаете какой-либо исполняемый файл с блокировкой, вы будете накладывать немного времени на выполнение, поэтому не всегда это делаете.
- Если у вас есть расчет, который длится долгое время, например, секунд или минут, или вы ожидаете, когда вы закончите использование
Await
, или вы ожидаете, что состояние монитора будет разрешено, и это условие может быть разрешено другой задачей/будущим, которое должно выполняться в одном и том же контексте выполнения - во всех этих случаях вы должны использоватьblocking
.
EDIT:
Посмотрите на главу 4 в Обучающее параллельное программирование в книге Scala.