Что делает параметр blockingQueue в конструкторе ThreadPoolExecutor
Что проверяют
Понимаете ли вы порядок решений внутри ThreadPoolExecutor. Очередь тут не просто буфер: именно она определяет, дойдёт ли дело до maximumPoolSize и что случится на всплеске нагрузки.
Как отвечать
Алгоритм такой. Если живых потоков меньше corePoolSize, создаётся новый поток, даже когда в очереди есть место. Дальше задача предлагается очереди. Если очередь отказала, пул растит потоки до maximumPoolSize. Если и это невозможно, срабатывает RejectedExecutionHandler.
Отсюда следствия по типам очереди:
LinkedBlockingQueueбез явной ёмкости фактически безгранична, отказа не случится никогда, значитmaximumPoolSizeне используется, а всплеск нагрузки превращается в рост кучи иOutOfMemoryError. Так устроенExecutors.newFixedThreadPool;SynchronousQueueне хранит ничего: задача либо передаётся свободному потоку, либо очередь отказывает и пул заводит новый поток. Так устроенnewCachedThreadPool;ArrayBlockingQueueс конечной ёмкостью даёт предсказуемый предел: сначала основные потоки, потом буфер, потом рост до максимума, потом отказ;PriorityBlockingQueueменяет порядок выборки, но она неограниченная, со всеми свойствами первого пункта.
Хорошо добавить про обратное давление: при CallerRunsPolicy отвергнутую задачу выполняет вызывающий поток, и поставщик сам притормаживает. Политика по умолчанию AbortPolicy бросает RejectedExecutionException.
Где спотыкаются
Думают, что execute заблокируется на полной очереди. Пул кладёт задачу через offer, без ожидания, и полная очередь приводит к новому потоку или к отказу, но не к остановке отправителя. Слово blocking относится к рабочим потокам, которые ждут задачу на take.
Второе: задают большой maximumPoolSize вместе с неограниченной очередью и удивляются, что пул не растёт. Пока очередь принимает, потоков сверх основных не появится.
Третье: повторяют миф, что ArrayBlockingQueue быстрее под конкуренцией. У неё один замок на вставку и выборку, а LinkedBlockingQueue разводит их по разным замкам и обычно масштабируется лучше.