2015-04-13 2 views
0

Я настроил ForkJoinPool использовать половину моих процессоров, как это:ForkJoinPool использует больше CPU, чем указано

ForkJoinPool forkJoinPool = new ForkJoinPool(
     Runtime.getRuntime().availableProcessors()/2); 

Однако, когда я представить работу, такие как сортировка слиянием описано there, пул использует вверх до 80% от моего процессора.

Ожидается ли это? Если да, существует ли способ эффективно ограничить количество рабочих потоков?

+0

Как вы рассчитываете или находите использование «80 +%»? – assylias

+0

Это значение, о котором сообщает мой системный монитор/верх. – avandecreme

+0

В linux по умолчанию верхние значения используют процессор как% от одного CPU, поэтому в вашем случае вы будете использовать 80% одного процессора, а не 80% всех ваших процессоров. – assylias

ответ

1

Чрезмерная проблема с потоками восходит к раннему Java7. Вы не указали, какую версию вы используете, но независимо от того, как Java7, так и Java8 имеют схожие проблемы с чрезмерными потоками. Java8u40 рассмотрел некоторые из чрезмерных проблем с вложенными вызовами, но за счет чрезмерного вращения.

Я писал постоянную критику этой структуры с 2011 года. Статья для Java8 - это here. В ней есть ссылки как на первые (Java7), так и на статьи 8u40.

Чтобы конкретно ответить на ваш вопрос: нет способа ограничить использование рабочих потоков этим фреймворком.

+0

Интересная статья. Я фактически использую Java8u40 (OpenJDK). – avandecreme

+0

Вы можете попробовать использовать класс CountedCompleter. Он не использует join(), поэтому вы можете получить лучшие результаты. То есть, если вы можете понять, как его использовать. – edharned

Смежные вопросы