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

281
25 апреля 2017, 06:17

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

Answer 1

Насколько я понимаю разница тут в следующем:

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

Рекомендуется использовать ForkJoinPool, если у вас есть набор задач, которые рекурсивно повторяются. Это позволяет вовсю использовать work-stealing. Если же задачи никак не разбиваются в процессе работы, то и выгоды никакой не получите, хотя и минусов от использование тоже не встретите.

Больше информации

Answer 2

Классические реализации ExecutorService создавали отдельные потоки и ими владели. ForkJoinPool же не создает отдельных потоков, а использует существующие в то время пока они "спят" на join-подобных вызовах, в этом его и достоинства, и недостатки.

Классические ExecutorService обычно нельзя использовать с задачами, которые синхронно ждут друг друга - они быстро исчерпывают доступный пул потоков, что приводит либо к взаимоблокировке, либо к его неограниченному распуханию. ForkJoinPool же такие ситуации умеет разруливать.

С другой стороны, задачи, исполняющиеся в рамках ForkJoinPool, обязаны быть достаточно короткими.

PS лично мне кажется, что любое использование ForkJoinPool является костылем для обхода проблемы слабой архитектуры

READ ALSO
Странное поведение ConcurrentHashMap и SocketOutputStream

Странное поведение ConcurrentHashMap и SocketOutputStream

Сейчас писал функцию для сервера приложения и убил очень много времени на поиск ошибкиВопрос из разряда "почему", а не как исправить, хочу...

249
threads размер папки

threads размер папки

нужна программа которая считает размер папки и напечатать результат по 1 секунду

184
Как получить координаты границы `Layout` в пикселях (px)

Как получить координаты границы `Layout` в пикселях (px)

Двигаю ImageView с помощью ImageViewanimate()

220
Как прочитать фото файл для загрузки в Bitmap?

Как прочитать фото файл для загрузки в Bitmap?

Пытаюсь загрузить изображение в Bitmap таким способом

183