1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Android - AsyncTaskの直列処理と並列処理の順番は保証されるのか??

Last updated at Posted at 2020-04-30

Android開発において、AsyncTaskで直列処理と並列処理について、ほぼ同時に動いた時はどのような動きになるのか、実際に順番は保証されるのかわからなかったので、軽くコードを組んでみて確認してみましたので、メモとして残しておきたいと思います。

【参考URL】
developer - AsyncTask
Android - AsyncTaskの直列処理?並列処理?
AsyncTaskの非同期処理はどのように実現しているのか

#【試作1】タスク1:直列処理、タスク2:並列処理の場合
task1:execute()
task2:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)

// 1つ目の非同期タスク
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(); 

// 2つ目の非同期タスク
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);

#実行結果
順番通りになっているかを確認するため、数回実行してみました。

【1回目】
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!!!


【2回目】
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!!!

【3回目】
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!!!

2回目のスタートが逆になっていますね。。。

#【試作2】タスク1:並列処理、タスク2:直列処理の場合
task1:executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
task2:execute()
※ソースコードは試作1とほぼ変わりません。

// 1つ目の非同期タスク
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(); 

// 2つ目の非同期タスク
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);

#実行結果
こちらも順番通りになっているかを確認するため、数回実行してみました。

【1回目】
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!!!

【2回目】
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!!!

【3回目】
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!!!

こちらの実行結果も試作1と似たような結果となっています。

#まとめ
直列処理と並列処理をほぼ同時に実行した場合の処理の順番は保証されないようです。
確実に順番を保証したい場合は、両方とも直列処理で行ったほうが良いですね。

#最後に
それ違うぞ!っという点もあるかと思いますが、参考程度になれば幸いです。

以上です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?