В чем разница между старыми имплементациями ExecutorService
из 1.5 и новой ForkJoinPool
из 1.7? Что такое можно сделать при помощи ForkJoinPool
, чего не сделать с старыми вариантами ExecutorService
? Или что проще сделать при помощи ForkJoinPool
?
Насколько я понимаю разница тут в следующем:
ExecutorService
имеет общую очередь задач и некоторое количество потоков, которые забирают по очереди таски и выполняют их.ForkJoinPool
имеет некоторое количество потоков, но при этом еще имеет очередь тасков для каждого потока. Поток в процессе работы может дробить задачу на несколько тасков, одну он добавляет к себе в очередь а другую выполняет и это может рекурсивно повторяться. Если другой поток опустошил свою очередь, то он может взять задачи у другого потока, с конца очереди. Описанный механизм называется work-stealing. Это и является ключевым моментом различающим данные thread-pool'ы. Рекомендуется использовать ForkJoinPool
, если у вас есть набор задач, которые рекурсивно повторяются. Это позволяет вовсю использовать work-stealing. Если же задачи никак не разбиваются в процессе работы, то и выгоды никакой не получите, хотя и минусов от использование тоже не встретите.
Больше информации
Классические реализации ExecutorService создавали отдельные потоки и ими владели. ForkJoinPool же не создает отдельных потоков, а использует существующие в то время пока они "спят" на join-подобных вызовах, в этом его и достоинства, и недостатки.
Классические ExecutorService обычно нельзя использовать с задачами, которые синхронно ждут друг друга - они быстро исчерпывают доступный пул потоков, что приводит либо к взаимоблокировке, либо к его неограниченному распуханию. ForkJoinPool же такие ситуации умеет разруливать.
С другой стороны, задачи, исполняющиеся в рамках ForkJoinPool, обязаны быть достаточно короткими.
PS лично мне кажется, что любое использование ForkJoinPool является костылем для обхода проблемы слабой архитектуры
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Сейчас писал функцию для сервера приложения и убил очень много времени на поиск ошибкиВопрос из разряда "почему", а не как исправить, хочу...
нужна программа которая считает размер папки и напечатать результат по 1 секунду
Двигаю ImageView с помощью ImageViewanimate()
Пытаюсь загрузить изображение в Bitmap таким способом