Я хочу отправить задачи Runnable
в ForkJoinPool с помощью метода:
forkJoinPool.submit(Runnable task)
Заметьте, я использую JDK 7.
Под капотом они превращаются в объекты ForkJoinTask. Я знаю, что ForkJoinPool эффективен, когда задача разбивается на более мелкие рекурсивно.
Вопрос:
В ForkJoinPool все еще работает воровство, если нет рекурсии?
Стоит ли в этом случае?
Обновление 1: Задачи небольшие и могут быть неуравновешенными. Даже для строго равных задач такие вещи, как переключение контекста, планирование потоков, парковка, пропуски страниц и т.д., Мешают дисбалансу.
Обновление 2: Дуг Ли написал в группе Concurrency JSR-166 Interest, указав на это:
Это также значительно повышает пропускную способность, когда все задачи являются асинхронными и представленный в пул, а не раздвоенный, что становится разумным способ структурирования каркасов актеров, а также множество простых сервисов, которые вы могли бы использовать ThreadPoolExecutor для.
Я полагаю, что, когда дело доходит до разумно небольших задач, связанных с процессором, ForkJoinPool - это путь, благодаря этой оптимизации. Главное, что эти задачи уже малы и не требуют рекурсивного разложения. Работает кража, независимо от того, является ли это большой или небольшой задачей. Задачи могут быть схвачены другим свободным работником из хвоста Deque занятого рабочего.
Обновление 3: Масштабируемость ForkJoinPool - бенчмаркинг команды пинг-понга Akka показывает отличные результаты.
Несмотря на это, для более эффективного применения ForkJoinPool требуется настройка производительности.