AsyncTask utilise un pool de threads modèle pour l'exécution de la substance à partir de doInBackground(). La question est à l'origine (en début de versions OS Android) la taille du pool est à seulement 1, ce qui signifie pas de calculs en parallèle pour un tas de AsyncTasks. Mais plus tard, ils ont résolu et maintenant la taille est de 5, donc au plus 5 AsyncTasks peuvent s'exécuter simultanément. Malheureusement, je ne me souviens pas en quelle version exactement ils ont changé ça.
Mise à JOUR:
Voici ce courant (2012-01-27) API dit à ce sujet:
Lors de sa première apparition, AsyncTasks ont été exécutés en série sur un seul thread d'arrière-plan. En commençant par DONUT, cela a été changé pour un pool de threads qui permet de réaliser plusieurs tâches en parallèle. Après en NID d'abeille, il est prévu de le changer vers un seul thread pour éviter les erreurs d'application causés par l'exécution en parallèle. Si vous voulez vraiment de l'exécution en parallèle, vous pouvez utiliser le executeOnExecutor(Exécuteur testamentaire, Params...) version de cette méthode avec THREAD_POOL_EXECUTOR; cependant, voir le commentaire là pour en garde sur son utilisation.
DONUT est Android 1.6, en NID d'abeille est Android 3.0.
Mise à JOUR: 2
Voir le commentaire en kabuko
de Mar 7 at 1:27
.
Il s'avère que pour les Api, où "un pool de threads qui permet de réaliser plusieurs tâches en parallèle" est utilisé (à partir de 1.6 et se terminant 3.0) le numéro de l'exécution simultanée de AsyncTasks dépend comment beaucoup de tâches ont été transmis pour exécution déjà, mais n'ont pas terminé leur doInBackground()
encore.
C'est testé et/ou confirmées par moi sur 2.2. Supposons que vous avez une coutume AsyncTask qui dort juste une seconde, en doInBackground()
. AsyncTasks fixe la taille de la file d'attente à l'interne pour le stockage de retard de tâches. Taille de file d'attente est de 10 par défaut. Si vous commencez à 15 vos tâches personnalisées dans une rangée, puis 5 premières vont entrer dans leur doInBackground()
, mais le reste va attendre dans une file d'attente pour un travailleur libre du fil. Dès les 5 premières finitions, et donc libère un thread de travail, une tâche de la file d'attente va lancer l'exécution. Donc dans ce cas dans la plupart des 5 tâches s'exécutent simultanément. Toutefois, si vous commencez à 16 vos tâches personnalisées dans une rangée, puis 5 premières vont entrer dans leur doInBackground()
, le reste 10 se met dans la file d'attente, mais pour le 16e un nouveau thread de travail sera créé afin d'en lancer l'exécution voit tout de suite. Donc dans ce cas dans la plupart des 6 tâches s'exécutent simultanément.
Il y a une limite de nombre de tâches peuvent être exécutées simultanément. Depuis AsyncTask
utilise un pool de threads exécuteur testamentaire limité le nombre maximum de threads de travail (128) et le retard dans les tâches de la file d'attente de taille fixe 10, si vous essayez d'exécuter plus de 138 personnalisée des tâches de l'application tombe en panne en java.util.concurrent.RejectedExecutionException
.
Départ depuis la version 3.0 de l'API permet d'utiliser votre personnalisée pool de threads exécuteur via AsyncTask.executeOnExecutor(Executor exec, Params... params)
méthode. Cela permet, par exemple, pour configurer la taille du fait du retard dans les tâches de la file d'attente si le défaut de 10 n'est pas ce dont vous avez besoin.
Mise à JOUR: 3
Voici un test simple application pour jouer avec le nombre de tâches, de série contre l'exécution en parallèle: https://github.com/vitkhudenko/test_asynctask
Mise à JOUR: 4 (merci @penkzhou pour le signaler)
À partir de Android 4.4 AsyncTask
se comporte différemment de ce qui a été décrit dans la mise à JOUR: 2 section. Il est un correctif pour empêcher AsyncTask
de la création d'un trop grand nombre de threads.
Avant d'Android 4.4 (API 19) AsyncTask
a les champs suivants:
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(10);
Dans Android 4.4 (API 19) les champs ci-dessus sont modifiés:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
Ce changement augmente la taille de la file d'attente à 128 éléments et réduit le nombre maximal de threads pour le nombre de cœurs du PROCESSEUR * 2 + 1. Les applications peuvent encore présenter le même nombre de tâches.