2013-10-09 8 views
2

Я хочу запустить несколько AsyncTask в AsyncTask.THREAD_POOL_EXECUTOR. Я использую следующий код.Удалите и завершите все задачи из AsyncTask.THREAD_POOL_EXECUTOR

Tasks[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 
                   taskParams); 

После того, как определенное количество потоков было направлено исполнителю, он больше не принимает новые AsyncTasks. (Я не вижу никаких ошибок, но doInBackGroundMethod по какой-то причине не запускается).

Я подозреваю, что это происходит, потому что это пул заполнен. Есть ли способ сбросить настройки исполнителя? Я хочу полностью завершить все задачи, чтобы они снова начали принимать новые задачи и немедленно их обрабатывали.

Я попытался завершить Задачи, используя их метод отменить, но это не помогло.

+0

Почему бы вам не создать собственный пул? AsyncTask действительно не идеален для мелкозернистого управления. (См. Класс Executors.) Тем не менее, если у вас есть хорошие задачи и есть ссылки на них, вы можете просто отменить() задачи. – Delyan

ответ

2

Выполнены ли ваши задачи? Вы справляетесь с соответствующими исключениями? Сколько задач вы создаете?

Имейте в виду, что AsyncTask.THREAD_POOL_EXECUTOR (по крайней мере, в API 17; этот документ страница имеет кучу полезных деталей), устанавливается с

public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); 

Где CORE_POOL_SIZE находится 5 и MAXIMUM_POOL_SIZE 128.

SPoolWorkQueue с

private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10); 

Это означает, что максимальная вместимость очереди составляет 10 единиц.

THREAD_POOL_EXECUTOR поддерживает не менее 5 потоков. По мере добавления заданий они добавляются в очередь. Когда очередь заполняется, тогда появятся новые потоки, до 128 (существуют другие ограничения tho).

Если это происходит (выполняется 128 потоков, максимальная скорость и очередь заполнена), то любые новые задачи будут отклонены и обработаны обработчиком по умолчанию (поскольку он явно не установлен, это AbortPolicy), который бросает a RejectedExecutionException.

Убедитесь, что вы не просто ловите и не обрабатываете такие исключения.

Один из способов борьбы с этим - создать свой собственный ExecutorService (даже если это только ваш экземпляр ThreadPoolExecutor с разными параметрами) и настроить параметры, которые лучше всего соответствуют вашей ситуации. Параметры, такие как очередь (вы можете контролировать количество элементов, которые оно может удерживать, или, если оно неограничено, и т. Д.) Или как обрабатывать отклоненные задачи.

1

Я вижу две причины отменив AsyncTasks еще работают:

  • Либо вы не вызываете cancel с mayInterruptIfRunning набор для true
  • Либо вы звоните AsyncTask.cancel(true) но InterruptedException мисс-обрабатывается выполненный код: Убедитесь, что ваш код (и возможные последующие вызовы в библиотеки) не запутывает/замалчивает InterruptedException с помощью try/catch на InterruptedException s или даже на Exception.
Смежные вопросы