[JAVA] Android - Ist die Reihenfolge der seriellen und parallelen Verarbeitung von AsyncTask garantiert? ??

In der Android-Entwicklung über serielle Verarbeitung und Parallelverarbeitung mit AsyncTask wusste ich nicht, welche Art von Bewegung es wäre, wenn es fast zur gleichen Zeit funktionieren würde, und die Reihenfolge ist tatsächlich garantiert. Lassen Sie uns also den Code leicht zusammenstellen und überprüfen. Ich habe es getan, also möchte ich es als Memo behalten.

[Referenz-URL] developer - AsyncTask Android-Serielle Verarbeitung von AsyncTask? Parallelverarbeitung? Wie wird die asynchrone Verarbeitung von AsyncTask realisiert

[Prototyp 1] Aufgabe 1: Bei serieller Verarbeitung Aufgabe 2: Bei paralleler Verarbeitung

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

//Erste asynchrone Aufgabe
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(); 

//Zweite asynchrone Aufgabe
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);

Ausführungsergebnis

Ich habe es mehrmals ausgeführt, um zu sehen, ob es in Ordnung war.

【Erstes Mal】
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!!!


【Zweites Mal】
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!!!

【Drittes Mal】
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!!!

Der zweite Start ist umgekehrt. .. ..

[Prototyp 2] Aufgabe 1: Parallelverarbeitung, Aufgabe 2: Bei serieller Verarbeitung

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

//Erste asynchrone Aufgabe
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(); 

//Zweite asynchrone Aufgabe
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);

Ausführungsergebnis

Ich habe es auch mehrmals versucht, um zu sehen, ob es in Ordnung war.

【Erstes Mal】
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!!!

【Zweites Mal】
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!!!

【Drittes Mal】
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!!!

Das Ausführungsergebnis hier ähnelt dem von Prototyp 1.

Zusammenfassung

Es scheint, dass die Reihenfolge der Verarbeitung nicht garantiert ist, wenn die serielle Verarbeitung und die parallele Verarbeitung fast gleichzeitig ausgeführt werden. Wenn Sie die Bestellung sicher garantieren möchten, ist es besser, beides in Serienbearbeitung zu tun.

Schließlich

Das ist anders! Ich denke, es gibt einen Punkt, aber ich hoffe, dass es hilfreich sein wird.

das ist alles.

Recommended Posts

Android - Ist die Reihenfolge der seriellen und parallelen Verarbeitung von AsyncTask garantiert? ??
Reihenfolge der Verarbeitung im Programm
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
Der Vergleich von enum ist == und gleich ist gut [Java]
Über das Problem des Deadlocks bei der Parallelverarbeitung in gem'sprockets '4.0
Warum die Breite des Vollbildelements 100% und die Höhe 100vh beträgt
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Das Designkonzept der Datums- und Uhrzeit-API von Java ist interessant
Die Frühjahrsvalidierung war in der Reihenfolge von Form und BindingResult wichtig
Holen Sie sich die Beschleunigung und Ausrichtung des Weltkoordinatensystems auf Android
'% 02d' Was ist der% von% 2?
Erläuterung der Reihenfolge der Schienenrouten
Dies und das von JDK
Der Inhalt des Rückgabewerts von executeBatch unterscheidet sich zwischen 11g und 12c
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?