Я хочу представить Runnable
задачи в ForkJoinPool с помощью метода:Java ForkJoinPool с нерекурсивными задачами, работает ли воровство?
forkJoinPool.submit(Runnable task)
Обратите внимание, я использую JDK 7.
Под капотом, они превращаются в объекты ForkJoinTask. Я знаю, что ForkJoinPool эффективен, когда задача разбивается на более мелкие рекурсивно.
Вопрос:
ли работа-угон все еще работают в ForkJoinPool, если нет рекурсии?
Стоит ли в этом случае?
Обновление 1: Задачи небольшие и могут быть неуравновешенными. Даже для строго равных задач такие вещи, как переключение контекста, планирование потоков, парковка, промахи страниц и т. Д., Мешают дисбалансу.
Update 2: Doug Lea писал в Concurrency JSR-166 Interest группы, давая намек на это:
Это также значительно повышает производительность, когда все задачи асинхронные и представлены в пул, а не раздвоенные , который становится разумным способом структурирования каркасов актеров, а также многих простых сервисов, которые могут быть использованы для использования в ThreadPoolExecutor для .
Я предполагаю, что, когда дело доходит до разумно небольших задач, связанных с процессором, ForkJoinPool - это путь, благодаря этой оптимизации. Главное, что эти задачи уже малы и не требуют рекурсивного разложения. Работающий воровство работает независимо от того, является ли это большой или маленькой задачей. Задачи могут быть схвачены другим свободным работником из хвоста Deque занятого рабочего.
Update 3: Scalability of ForkJoinPool - бенчмаркинга Akka команда пинг-понг показывает отличные результаты.
Несмотря на это, для более эффективного применения ForkJoinPool требуется настройка производительности.
Я сам это задался, и я думаю, что это то, о чем вы упомянули, с парковкой и запиранием нитей. Вот почему я считаю, что кольцевые буферы (прерыватель) еще быстрее, чем разворачиваемые вилки (по крайней мере, для моих нерекурсивных задач). –
@Adam Gent Мы тоже использовали Disruptor - это потрясающе быстро. И да, идея RingBuffer применяется во многих современных структурах данных. Тем не менее, они различаются по порядку: 1. Разрушитель использует 1 нить - 1 потребительскую модель для конвейерной обработки и не может красть работу, тогда как 2. FJ - это пул работников - работа распределяется по числу потоков (m: n). –
Я знаком с различиями в fj-rb, но я думаю, что оба они могут пригодиться в меньшей блокировке, но я не специалист каким-либо образом. –