Получить по умолчанию ThreadPoolExecutor?

Я делаю приложение для Android и испытываю проблемы с появлением AsyncTask RejectedExecutionException (возможно, из-за чрезмерного использования AsyncTask ). Я хотел бы получить по умолчанию ThreadPoolExecutor и прочитать getTaskCount() и getCompletedTaskCount() .

Как получить экземпляр ThreadPoolExecutor , не создав его вручную?

Прямо там, в документе для AsyncTask. Есть два. Они называются

 AsyncTask.SERIAL_EXECUTOR 

а также

 AsyncTask.THREAD_POOL_EXECUTOR 

соответственно.

Обратите внимание, что эти два Исполнителя используют для выполнения одного и того же многопотокового резервного Исполнителя. Серийный исполнитель не имеет нитки! Он просто имеет перед ним детекцию, которая заставляет выполнять серийные задания.

В системе Android AsyncTask есть два исполнителя по умолчанию: SerialExecutor и ThreadPoolExecutor . AsynkTask использует другой исполнитель, поскольку исполнитель по умолчанию зависит от платформы.

Начиная с DONUT, это было изменено на пул потоков, позволяющий нескольким задачам работать параллельно. Начиная HONEYCOMB, задачи возвращаются к выполнению в одном потоке, чтобы избежать общих ошибок приложений, вызванных параллельным выполнением.

Вы можете принудительно выполнить исполнитель для выполнения задачи в исполняемых вами целях, используя эту функцию. Вы можете передать AsycTask.SERIAL_EXECUTOR или AsycTask.THREAD_POOL_EXECUTOR этой функции. И после этого вы можете использовать его для своих нужд.

Вы получаете RejectedExecutionException потому что очередь ожидания пула потоков заполнена, и вы пытаетесь отправить другую задачу. Вы должны начать здесь, чтобы рефакторировать / переосмыслить свой код, потому что размер очереди, кажется, равен 10 плюс активная нить, которая должна быть достаточной в большинстве случаев. Очень вероятно, что некоторые из ваших задач не заканчиваются или не выполняются долгое задание и блокируют других или что вы дико отправляете потоки;)

Asynctask имеет 2 встроенных пула потоков:

  • SERIAL_EXECUTOR – пул одиночных потоков
  • THREAD_POOL_EXECUTOR – одновременное выполнение до 128 потоков (5 ядер)

В SDK> 11 по умолчанию используется SERIAL_EXECUTOR. Поэтому вы можете попробовать THREAD_POOL_EXECUTOR , но будьте осторожны, что это можно использовать только в SDK => 11, поскольку executeOnExecutor был более новым методом. Это исправит вашу непосредственную проблему, но вы должны пересмотреть, если вам нужно много потоков. Или используйте другие методы, например, службы, если у вас много давних задач.

Альтернативно, если вы хотите создать собственный ThreadPool, вы можете создать его с помощью Executors: например, Executors.newCachedThreadPool () (среди других статических конструкторов).