2015-06-02 2 views
1

Недавно я работал с ThreadPoolExecutor и priorityqueue и наткнулся на оба метода future.cancel() на будущую задачу. И task.remove() на задачу, которую он сам, чтобы удалить из очереди.Отменить() vs remove() на исполнителей

Каков наилучший вариант? есть ли разница? Я могу сохранить список как (будущий объект, полученный от представить() или сами задачи), не уверен, что использовать ...

удалить:

executor.remove(task); 
executor.purge(); 

отменить:

futureObject.cancel(false); 

Я использовал следующее: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html#remove%28java.lang.Runnable%29

false В отмене это потому, что я хочу только удалить задачу очереди, если она запустится, пусть она закончит.

ответ

1

Использование Future.cancel()

Javadoc для ThreadPoolExecutor.remove() утверждает, что она может «не в состоянии удалить задачи, которые были преобразованы в другие формы перед помещением на внутренней очереди», так что я бы не рекомендовал называть его, если вы не что задача не была преобразована внутренне.

Учитывая, что если у вас есть Future, я бы рекомендовал отменить его, позвонив по телефону Future.cancel(). Это имеет дополнительное преимущество, делать правильные вещи, если кто-то есть ссылка на Future и решают назвать Future.get()

Если вы параноик о размере кучи, используемой отмененных задачами, вы можете позвонить ThreadPoolExecutor.purge() после вызова Future.cancel() ,

Кстати, метод ThreadPoolExecutor.purge() удаляет только фьючерсы, поэтому вызов purge() после remove(), скорее всего, не работает.

1

Я бы использовал тот, который более естественен для вас. Без дополнительной информации, которая, скорее всего, является cancel

remove/purge намного дороже и действительно нужно, если вы обеспокоены тем, что у вас будет так много этих задач, что они могут использовать слишком много памяти.

Разница довольно понятная, отмена просто отменяет задачу. remove/purge удаляет задачу из очереди.

+0

Я использую PriorityQueue поэтому я сохранить ComparableFutureTask, как это наводит на мысль: http://stackoverflow.com/questions/30574777/implementing-priorityqueue-on-threadpoolexecutor Я переопределение выполнить, чтобы вернуться, что ComparabaleFutureTask и сохранить все ссылки и на этом объекте i заготовку cancel(). и по какой-то причине он не работает ... Я предполагаю, что вам нужно открывать новый вопрос, характерный для этого события, но предполагается ли, что он работает на сопоставимомFutureTask? Любой –

+0

@sharongur Что вы подразумеваете под; «это не работает» и что вы ожидали? –

+0

Отменяю задачу и вставляю новую с более высоким приоритетом, но порядок выполнения остается неизменным. и никакая новая задача не вставлена ​​ –

0

Если вы ожидаете, что cancel будет отменен или ваша главная проблема связана с памятью, тогда используйте remove/purge. Но в любом другом случае я бы пошел за cancel.