В моем коде есть пул потоков, реализованный с фиксированным пулом потоков ExecutorService
. Большинство задач, выполняемых пулом, очень короткие, но порой есть одна задача, которая будет работать в течение длительного времени, около 20-30 секунд. При выполнении этой задачи новые задачи не выполняются и будут возобновляться только при завершении заданий, выполняемых в течение длительного времени.Фиксированный пул ExecutorService зависает по одной задаче
Пул установлен в 20, так что это не проблема, так как я могу воссоздать это только с двумя потоками, сначала это длинный, а второй застревает.
Я задумался, почему он застрял, а затем переключился с newFixedThreadPool()
на newCachedThreadPool()
, и узкое место было выпущено. Это единственное изменение, которое я сделал.
Имеет ли смысл такое поведение? Код, кажется, работает нормально, поэтому, я думаю, я сохраню изменения, и насколько я понимаю, лучше использовать пул потоков кеша, если у вас много коротких задач, но мне было интересно, почему фиксированный пул зависает и есть способ исправить это?
Кроме того, что может быть связано с проблемой, если она есть, для переключения с фиксированного на кеш?
Спасибо.
Кажется, не имеет смысла. Вы уверены, что ничего не изменили? – Thilo
Когда проблема появляется снова, сделайте 'kill -QUIT', чтобы получить трассировки стека всех потоков, чтобы увидеть, что они делают. – Thilo
Все зависит от того, как вы создали свой пул потоков. Покажите нам код, и мы можем найти причину. –