[JAVA] Android - L'ordre du traitement série et du traitement parallèle d'AsyncTask est-il garanti? ??

Dans le développement Android, à propos du traitement série et du traitement parallèle avec AsyncTask, je ne savais pas quel genre de mouvement il s'agirait s'il fonctionnait presque en même temps, et la commande est réellement garantie, alors composons légèrement le code et vérifions-le. Je l'ai fait, alors j'aimerais le garder comme note de service.

[URL de référence] developer - AsyncTask Traitement Android-Serial d'AsyncTask? Traitement parallèle? Comment est réalisé le traitement asynchrone d'AsyncTask

[Prototype 1] Tâche 1: En cas de traitement série, Tâche 2: En cas de traitement parallèle

task1:execute() task2:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)

//Première tâche asynchrone
AsyncTask task1 = new AsyncTask() {

    @Override
    protected Object doInBackground(Object[] objects) {
        Log.v("task1", "start!!!");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        Log.v("task1", "done!!!");
    }
}
.execute(); 

//Deuxième tâche asynchrone
AsyncTask task2 = new AsyncTask() {

    @Override
    protected Object doInBackground(Object[] objects) {
        Log.v("task2", "start!!!");
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        Log.v("task2", "done!!!");
    }
}
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Résultat d'exécution

Je l'ai couru plusieurs fois pour voir s'il était en ordre.

【Première fois】
5970-5995/com.example.testcode V/task2: start!!!
5970-5994/com.example.testcode V/task1: start!!!

5970-5970/com.example.testcode V/task2: done!!!
5970-5970/com.example.testcode V/task1: done!!!


【Deuxième fois】
7138-7157/com.example.testcode V/task2: start!!!
7138-7156/com.example.testcode V/task1: start!!!

7138-7138/com.example.testcode V/task2: done!!!
7138-7138/com.example.testcode V/task1: done!!!

【Troisième fois】
7383-7403/com.example.testcode V/task1: start!!!
7383-7404/com.example.testcode V/task2: start!!!

7383-7383/com.example.testcode V/task2: done!!!
7383-7383/com.example.testcode V/task1: done!!!

Le deuxième départ est inversé. .. ..

[Prototype 2] Tâche 1: traitement parallèle, tâche 2: en cas de traitement série

task1:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) task2:execute()

//Première tâche asynchrone
AsyncTask task1 = new AsyncTask() {

    @Override
    protected Object doInBackground(Object[] objects) {
        Log.v("task1", "start!!!");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        Log.v("task1", "done!!!");
    }
}
.execute(); 

//Deuxième tâche asynchrone
AsyncTask task2 = new AsyncTask() {

    @Override
    protected Object doInBackground(Object[] objects) {
        Log.v("task2", "start!!!");
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        Log.v("task2", "done!!!");
    }
}
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Résultat d'exécution

Je l'ai également essayé plusieurs fois pour voir s'il était en ordre.

【Première fois】
7267-7273/com.example.testcode V/task2: start!!!
7267-7272/com.example.testcode V/task1: start!!!

7267-7267/com.example.testcode V/task2: done!!!
7267-7267/com.example.testcode V/task1: done!!!

【Deuxième fois】
7643-7662/com.example.testcode V/task1: start!!!
7643-7663/com.example.testcode V/task2: start!!!

7643-7643/com.example.testcode V/task2: done!!!
7643-7643/com.example.testcode V/task1: done!!!

【Troisième fois】
7871-7891/com.example.testcode V/task1: start!!!
7871-7892/com.example.testcode V/task2: start!!!

7871-7871/com.example.testcode V/task2: done!!!
7871-7871/com.example.testcode V/task1: done!!!

Le résultat de l'exécution ici est similaire à celui du Prototype 1.

Résumé

Il semble que l'ordre de traitement n'est pas garanti lorsque le traitement série et le traitement parallèle sont exécutés presque en même temps. Si vous voulez sûrement garantir la commande, il est préférable de faire les deux en série.

finalement

C'est différent! Je pense qu'il y a un point, mais j'espère que ce sera utile.

c'est tout.

Recommended Posts

Android - L'ordre du traitement série et du traitement parallèle d'AsyncTask est-il garanti? ??
Ordre de traitement dans le programme
L'ordre des modificateurs de méthode Java est fixe
La comparaison d'énumération est ==, et equals est bonne [Java]
À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
Pourquoi la largeur de l'élément plein écran est de 100% et la hauteur de 100vh
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Le concept de conception de l'API de date et d'heure de Java est intéressant
La validation de printemps était importante dans l'ordre de Form et BindingResult
Obtenez l'accélération et l'orientation du système de coordonnées mondial sur Android
'% 02d' Quel est le% de% 2?
Explication de l'ordre des itinéraires ferroviaires
Ceci et cela de JDK
Le contenu de la valeur de retour de executeBatch est différent entre 11g et 12c
Est-il possible de mettre la bibliothèque (aar) dans la bibliothèque Android (aar) et de l'utiliser?