3

AsyncTask.THREAD_POOL_EXECUTOR でいくつかの AsyncTask を実行したいと考えています。次のコードを使用しています。

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

エグゼキュータに一定数のスレッドが送信されると、新しい AsyncTasks を受け入れなくなります。(エラーは表示されませんが、何らかの理由で doInBackGroundMethod が開始されません)。

プールがいっぱいなので、これが発生すると思われます。エグゼキュータをリセットする方法はありますか? すべてのタスクを完全に終了して、新しいタスクを再び受け入れてすぐに処理できるようにしたいと考えています。

cancelメソッドを使用してタスクを終了しようとしましたが、役に立ちませんでした。

4

2 に答える 2

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 で128MAXIMUM_POOL_SIZEです。

sPoolWorkQueue と

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

これは、キューの最大容量が 10 項目であることを意味します。

THREAD_POOL_EXECUTOR は、少なくとも 5 つのスレッドを有効に保ちます。タスクが追加されると、キューに追加されます。キューがいっぱいになると、最大 128 個の新しいスレッドが生成されます (他にも制限があります)。

これが発生すると (最大 128 個のスレッドが実行され、キューがいっぱいになると)、新しいタスクはすべて拒否され、既定のハンドラー (明示的に設定されていないため、 is ) で処理され、 RejectedExecutionExceptionAbortPolicyがスローされます。

そのような例外をキャッチして処理しないだけではないことを確認してください。

これに対処する 1 つの方法は、独自のExecutorServiceを作成し (異なるパラメーターを持つ ThreadPoolExecutor のインスタンスであっても)、状況に最適なパラメーターを構成することです。キューなどのパラメーター (保持できるアイテムの量を制御できるか、無制限かどうかなど) や、拒否されたタスクの処理方法。

于 2013-10-09T06:07:17.807 に答える
1

実行中の AsyncTasks をキャンセルした理由は 2 つあります。

  • に設定して呼び出しcancelていないかmayInterruptIfRunningtrue
  • 呼び出しますAsyncTask.cancel(true)InterruptedException、実行されたコードによって誤って処理されます: コード (および可能性のあるその後のライブラリへの呼び出し) が、 s または でさえInterruptedExceptiontry/catch によって s を難読化/サイレンスしないようにしてください。InterruptedExceptionException
于 2013-10-17T16:46:21.147 に答える