Я не понимаю это поведение ThreadPoolExecutor - PullRequest
1 голос
/ 31 августа 2011

У меня есть ThreadPoolExecutor, созданный с неограниченной очередью (LinkedBlockingQueue) и размером ядра и максимального пула, равным числу процессоров (скажем, 4).

Каждый великий, пока я получаю исключение RejectedExecutionException.Исполнитель находится в рабочем состоянии.Насколько я понимаю, это не должно происходить с неограниченной очередью.

Я не смог отловить это в отладчике, чтобы точно увидеть, что происходит, но из трассировки стека это выглядит как в ThreadPoolExecutor.execute,workQueue.offer возвращает false, поэтому он переходит к биту, где он пытается раскрутить новый поток.Но poolSize уже на максимуме, поэтому он генерирует исключенное исключение при выполнении.

Я не совсем понимаю это.

Но независимо от того, должен ли я сделать максимальный размер пула немного больше размера основного пула?

Ответы [ 2 ]

2 голосов
/ 31 августа 2011
  1. Даже «неограниченный» LinkedBlockingQueue на самом деле ограничен в Integer.MAX_VALUE .Да, маловероятно, что вы достигнете этого предела, но "как только вы устраните невозможное ..."В моем исходном коде проверка состояния и вызов offer () находятся в одной строке, поэтому вы не сможете различить их в трассировке стека.
2 голосов
/ 31 августа 2011

LinkedBlockingQueue.offer() возвращает false, когда он на полную мощность. Если емкость не указана, используется Integer.MAX_VALUE.

Это происходит при добавлении на 2147483647 больше задач, чем размер пула?

...