Страницы

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

понедельник, 10 февраля 2020 г.

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

#java #многопоточность


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


Ответы

Ответ 1



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

Ответ 2



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

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

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