2015-06-22 3 views
1

Все доступные конструкторы ScheduledThreadPoolExecutor требуют аргумента corePoolsize. Но я не уверен, сколько мне действительно нужно?Java ScheduledThreadPoolExecutor, определяющий, сколько потоков необходимо

Я планирую использовать его в классе, где один экземпляр его будет использовать только одну запланированную задачу. Поэтому бессмысленно устанавливать размер пула на что-либо еще, кроме 1? Или мне нужно создать статический экземпляр ScheduledThreadPoolExecutor для совместного использования всех экземпляров моего собственного класса?

ответ

1

Если вы только планируете запланировать одну задачу для каждого экземпляра вашего класса вам не нужно использовать более 1 поток в бассейне. Даже если вы используете scheduleAtFixedRate, если вы планируете только одну задачу, она никогда не будет выполняться одновременно, даже если она будет работать дольше, чем ее период. Следовательно, если вы планируете только одну задачу, вам нужен только один поток.

Создание общего экземпляра исполнителя может быть хорошей идеей, если это имеет смысл в вашей программе. Вы получите лучшую производительность, если вам не нужно создавать исполнителей и потоки для каждого экземпляра. Однако вы должны позаботиться о том, чтобы установить corePoolSize как минимум на максимальное количество ожидаемых одновременных задач. В противном случае задачи могут быть отложены.

-1

Лучше всего использовать количество ядер, доступных на машине, ваша программа работает как значение для этого параметра.

Пример:

int cores = Runtime.getRuntime().availableProcessors(); 
+0

Уход за разъяснением этого руководства? Я не думаю, что это хороший ориентир, особенно для дела OP. –

+0

Основываясь на моем понимании, OP ищет размер пула при создании ScheduledThreadPoolExecutor. В любой заданной точке машина/процессор может обрабатывать только N количество потоков, где N - количество ядер. Например, если машина является четырехъядерной, это означает, что параллельно можно запускать только 4 потока, поэтому нет смысла создавать пул большего размера. Пул с количеством ядер + 2 (чтобы помочь с переключением контекста) может быть достаточно хорошим, чтобы получить хорошую производительность. – kosa

+1

Во многих случаях * * делает большой смысл создавать больше потоков, чем количество процессоров. Наиболее распространенный случай - это когда вы хотите распараллелить IO. У вас может быть много потоков, ожидающих ввода-вывода на одном ядре ... Если вы выполняете 100% -ные задачи с привязкой к ЦП, я склонен согласиться с вашей мыслью, но это довольно предположение. –

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