2017-02-02 3 views
0

Я бег некоторых задач асинхронных и 1 из моих пользователей врезаться с RejectedExecutionExemption:Нужна помощь понимания «RejectedExecutionExemption»

трассировкой стека

stackTrace: java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 240] 
    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2014) 
    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794) 
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1340) 
    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:607) 

Линии вызывает исключение

new SetDownloadStatusTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

Вопрос о двух частях здесь действительно ..

  1. Я хотел бы получить помощь понимание первой линии, за исключением:

    ThreadPoolExecutor @ f5f25ac [Запуск, размер пула = 9, активные потоки = 9, очереди задач = 128, завершенные задачи = 240]

    Размер пула по сравнению с активными потоками по сравнению с четырьмя задачами .. Предполагаю, что выполняю слишком много задач, но я не уверен, как это определить для этих трех переменных. Если кто-то может сломать это для меня, я ценю это.

  2. Если это так, что у меня заканчиваются потоки, я должен увеличить допустимое количество и если да, то как, или есть лучшее решение.

Пользовательские AsyncTask

private class SetDownloadStatusTask extends AsyncTask<Void, Void, DownloadStatus> { 

     @Override 
     protected DownloadStatus doInBackground(Void... params) { 
      return bookDownloadManager.status(product); 
     } 


     @Override 
     public void onPostExecute(DownloadStatus downloadStatus) { 
      updateMenuForDownloadStatus(downloadStatus); 
     } 
    } 

ответ

3

Я предполагаю, что я слишком много выполнения задач

Correct.

Если кто-то может разрушить это для меня, Id ценят это

AsyncTask.THREAD_POOL_EXECUTOR на четырёхъядерный процессор будет поддерживать девять параллельных потоков (pool size = 9). Это подкрепляется LinkedBlockingQueue максимальной длины 128. И вы запросили 138-ю одновременную задачу, поэтому у нас нет нитей (active threads = 9), и очередь заполнена (queued tasks = 128).

я должен увеличить количество разрешенного, и если да, то как, или есть лучшее решение

Вы должны спросить себя «почему во имя всего святого я пытаюсь загрузить 138 вещи сразу? ».

Если есть законная потребность в этом, используйте свой собственный Executor, а не THREAD_POOL_EXECUTOR. Если нет необходимости в 138+ одновременных загрузках — и, честно говоря, это число кажется безумным —, а затем измените свой код, чтобы избежать этого, например, отменить задачи, которые вам больше не нужны.

+0

было бы здорово, если эти данные будут обновлены в главе «Темы» книги. – OBX

+0

@OBX: Предполагая, что «книга» относится к [моей книге] (https://commonsware.com/Android), см. Стр. 534 Версии 8.2. – CommonsWare

+0

Хмм, я попробовал загрузить его с помощью IDM, и я получил v 8.0, загрузив 8.2 сейчас на жесткий путь – OBX

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