Страницы

Поиск по вопросам

пятница, 19 апреля 2019 г.

В чем разница между ExecutorService и ForkJoinPool?

В чем разница между старыми имплементациями ExecutorService из 1.5 и новой ForkJoinPool из 1.7? Что такое можно сделать при помощи ForkJoinPool, чего не сделать с старыми вариантами ExecutorService? Или что проще сделать при помощи ForkJoinPool?


Ответ

Насколько я понимаю разница тут в следующем:
ExecutorService имеет общую очередь задач и некоторое количество потоков, которые забирают по очереди таски и выполняют их. ForkJoinPool имеет некоторое количество потоков, но при этом еще имеет очередь тасков для каждого потока. Поток в процессе работы может дробить задачу на несколько тасков, одну он добавляет к себе в очередь а другую выполняет и это может рекурсивно повторяться. Если другой поток опустошил свою очередь, то он может взять задачи у другого потока, с конца очереди. Описанный механизм называется work-stealing. Это и является ключевым моментом различающим данные thread-pool'ы.
Рекомендуется использовать ForkJoinPool, если у вас есть набор задач, которые рекурсивно повторяются. Это позволяет вовсю использовать work-stealing. Если же задачи никак не разбиваются в процессе работы, то и выгоды никакой не получите, хотя и минусов от использование тоже не встретите.
Больше информации

Комментариев нет:

Отправить комментарий