2012-04-17 5 views
7

Я хочу создать пул потоков фиксированного размера, который не вносит никакой задачи в свою очередь. Другими словами, если пул потоков в настоящее время используется, входящая задача должна быть отклонена напрямую. Основываясь на documentation, одним из способов сделать это, на мой взгляд, было бы создание объекта Dummy Queue, который отказывается признать задачу. Каков идиоматический способ сделать это на Java?ThreadPoolExecutor без очереди

ответ

10

Вы можете использовать SynchronousQueue в своем ThreadPoolExector, который представляет собой очередь, которая не содержит объектов. Пул кэшированных потоков использует это, потому что он создает новые потоки по требованию.

Если он не может быть поставлен в очередь, но я бы предложил использовать RejectedExecutionHandler для выполнения задачи в текущем потоке. Таким образом, он всегда будет запускаться «немедленно».

BTW: Было бы полезно дать понять, почему вы хотите это сделать.

0

Можете ли вы уточнить, почему вы хотите сделать такое? Основная цель TP + Q состоит в том, чтобы иметь автоматический «механизм удержания» для работы и отделить рабочих от процесса создания работы. Если ваше намерение состоит в том, чтобы иметь только столько приемлемых рабочих пакетов, сколько работникам, тогда вам действительно не нужен TPE.

+0

Задача может быть выбрана другим исполнителем пула потоков с бесплатными потоками, а не ожиданием очереди в первом. Что я должен использовать вместо ThreadPoolExecutor? –

+0

Если вы хотите контролировать выполнение, TPE не является вашим выбором. Вам лучше иметь простую коллекцию рабочих потоков, с помощью которой вы можете передать задание (если они доступны) простой набор , который вы создаете и вытаскиваете/выталкиваете из них в основной поток. – vivekv

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