2013-08-05 2 views
1

При чтении документов для Threadpool исполнителя я см ниже:Очистка план очереди в ограниченной ThreadPoolExecutor

Два поставляемых методы, удалить (java.lang.Runnable) и продувки() доступны, чтобы помочь в хранении рекультивация, когда большое количество поставленных задач отменяется.

Я понимаю, что, хотя я могу использовать эти методы для очистки рабочей очереди, если какие-либо задачи отменены. Я пытаюсь понять, какая часть в фактическом источнике делает эту очистку автоматически. Предположим, что я начинаю с очереди из 10, и из них 4 задания отменены, когда придет новая задача, размер очереди будет 6 или он просто проигнорирует 4 отмененную задачу и сбрасывается на 10.

От источник я вижу этот комментарий:

/** 
* Tries to remove from the work queue all 
* tasks that have been cancelled. This method can be useful as a 
* storage reclamation operation, that has no other impact on 
* functionality. Cancelled tasks are never executed, but may 
* accumulate in work queues until worker threads can actively 
* remove them. Invoking this method instead tries to remove them now. 
* However, this method may fail to remove tasks in 
* the presence of interference by other threads.* 
*/ 
public void purge() { 

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

Спасибо за ваше время,

ответ

2

Нити рабочие будут активно удалять отмененные задачи во время нормальной работы, когда они принимают() задачи из очереди работы в ThreadPoolExecutor.getTask(), и попытка запуска () их. Когда базовый FutureTask, представляющий Runnable unit of work, вызывает его FutureTask $ Sync.innerRun(), он сначала проверяет ожидаемое состояние READY, иначе оно возвращается. Таким образом, выполнение пропускается, если задача была отменена, и она уже удалена из workQueue. Если задача уже запущена, флаг mayInterruptIfRunning для FutureTask.cancel() определяет, выполняется ли прерывание().

Это означает, что по умолчанию отмененные задачи сидят в рабочей области до тех пор, пока доступный Рабочий не попытается обработать его, выяснит, что задача была отменена, и завершает свою обработку. Поэтому ответ на ваш вопрос о размере очереди зависит от того, достиг ли работник любой из этих задач. ThreadPoolExecutor.purge() позволяет вручную запускать немедленный обход workQueue для удаления отмененных задач.

+0

Благодаря @Buzz это имеет смысл. Я проверяю код, и я понимаю, что вы имеете в виду. Еще раз спасибо – duskandawn

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