AsyncTask
かなり長い話があります。
Cupcake (1.5) で初めて登場したときは、1 つの追加スレッド (1 つずつ) でバックグラウンド操作を処理していました。Donut (1.6) では変更され、スレッドのプールが使用されるようになりました。また、プールが使い果たされるまで、複数の操作を同時に処理できました。このような場合、操作はキューに入れられました。
Honeycomb のデフォルトの動作は、単一のワーカー スレッド (1 つずつ処理) を使用するように切り替えられているためです。しかし、新しいメソッド ( executeOnExecutor ) が導入され、必要に応じて同時にタスクを実行できるようになりました (2 つの異なる標準のエグゼキュータがあります:SERIAL_EXECUTOR
とTHREAD_POOL_EXECUTOR
)。
タスクがキューに入れられる方法も、使用するエグゼキューターによって異なります。パラレルの場合は10個まで( )に制限されますnew LinkedBlockingQueue<Runnable>(10)
。シリアルの場合は制限なし(new ArrayDeque<Runnable>()
)。
したがって、タスクの処理方法は、タスクの実行方法と実行する SDK バージョンによって異なります。スレッドの制限については保証されていませんが、ICS ソース コードを見ると、プール内のスレッドの数は範囲内で変動する可能性があると言えます5..128
。
デフォルトの方法で 100000 を起動すると、execute
シリアル エグゼキュータが使用されます。すぐに処理できないタスクはキューに入れられるため、取得されますOutOfMemoryError
(数千のタスクが配列でバックアップされたキューに追加されます)。
一度に開始できるタスクの正確な数は、実行しているデバイスのメモリ クラスと、使用するエグゼキュータによって異なります。