Java 5 ввела поддержку для выполнения асинхронной задачи пулом потоков в форме инфраструктуры Executor, чье сердце является пулом потоков, реализованным java.util.concurrent.ThreadPoolExecutor. Java 7 добавила альтернативный пул потоков в виде java.util.concurrent.ForkJoinPool.В чем преимущество Java-5 ThreadPoolExecutor над Java-7 ForkJoinPool?
Рассматривая свой API, ForkJoinPool обеспечивает надстройку функциональности ThreadPoolExecutor в стандартных сценариях (хотя, строго говоря, ThreadPoolExecutor предлагает больше возможностей для настройки, чем ForkJoinPool). Добавляя к этому замечание, что задачи fork/join кажутся более быстрыми (возможно, из-за планировщика кражи работы), нужно определенно меньше потоков (из-за операции без блокировки соединения), может возникнуть впечатление, что ThreadPoolExecutor был заменен от ForkJoinPool.
Но это действительно правильно? Весь материал, я прочитал, кажется, подвести итог довольно смутное различие между этими двумя типами пулов потоков:
- ForkJoinPool для многих, в зависимости, задачи сгенерированные, короткие, вряд ли когда-либо блокировки (т.е. требующих интенсивных вычислений) задачи
- ThreadPoolExecutor для нескольких независимых, внешне сгенерированных, длинных, иногда блокирования задач
является ли это различие правильно вообще? Можем ли мы сказать что-то более конкретное об этом?
Я думаю, что fork join рассматривает рекурсивный случай по-разному, они должны украсть более новые задачи в рекурсивных случаях. – user
@user В соответствии с «Рамкой вилки/объединения Java» Дуга Ли: Когда рабочий поток не имеет локальных задач для запуска, он пытается взять («украсть») задачу у другого произвольно выбранного работника, используя FIFO (старейший первый) правило. – shams
Следует добавить, что «deque», о котором говорят многие люди, не является известной реализацией [Deque] (http://docs.oracle.com/javase/7/docs/api/java/util/Deque.html) интерфейс. Это массив. См. Исходный код 'ForkJoinWorkerThread'. У него есть поле для доступа по умолчанию 'ForkJoinTask > [] queue'. –