В чем разница между старыми имплементациями 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 является костылем для обхода проблемы слабой архитектуры
Виртуальный выделенный сервер (VDS) становится отличным выбором
Сейчас писал функцию для сервера приложения и убил очень много времени на поиск ошибкиВопрос из разряда "почему", а не как исправить, хочу...
нужна программа которая считает размер папки и напечатать результат по 1 секунду
Двигаю ImageView с помощью ImageViewanimate()
Пытаюсь загрузить изображение в Bitmap таким способом