Java 5 представила поддержку для выполнения асинхронной задачи пулом потоков в виде инфраструктуры Executor, чье сердце является пулом потоков, реализованным java.util.concurrent.ThreadPoolExecutor. Java 7 добавила альтернативный пул потоков в виде java.util.concurrent.ForkJoinPool.
Посмотрев на свой API, ForkJoinPool обеспечивает надстройку функциональности ThreadPoolExecutor в стандартных сценариях (хотя, строго говоря, ThreadPoolExecutor предлагает больше возможностей для настройки, чем ForkJoinPool). Добавив к этому замечание, что fork/join задачи кажутся более быстрыми (возможно, из-за планировщика кражи работы), нужно определенно меньше потоков (из-за операции неблокирующего соединения), может возникнуть впечатление, что ThreadPoolExecutor был заменен ForkJoinPool.
Но это действительно правильно? Весь материал, который я прочитал, похоже, сводится к довольно расплывчатому различию между двумя типами пулов потоков:
- ForkJoinPool предназначен для многих, зависимых, заданных, коротких, вряд ли когда-либо блокирующих (то есть вычислительных) задач
- ThreadPoolExecutor - это несколько, независимых, созданных извне, длинных, иногда блокирующих задач.
Является ли это различие правильным? Можем ли мы сказать что-то более конкретное об этом?