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