@anya_hacker

Почему AsyncTask не создаёт параллельные потоки?

Есть активность с тремя виджетами: текст, кнопка и чек бокс
Если к кнопке привязать создание нового потока через Thread и через AsyncTask, то при повторном нажатии на кнопку Thread создаст параллельно еще второй поток, в то время как AsyncTask создаст новый поток только после исполнения первого. Почему AsyncTask не добавляет сразу же новый поток параллельно с первым, как это делает Thread, ведь в AsyncTask под капотом же тот же Thread?
Макет:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn"
        android:text="button"/>

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        tools:ignore="MissingConstraints" />

</LinearLayout>


Код:
package ru.examp.constraintlayoutpracticeapplication;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    Button btn;
    int i = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                MyAsync my = new MyAsync();
                my.execute();

                Myt m = new Myt();
                m.start();
            }
        });
    }

    class Myt extends Thread{
        public void run(){
            for (int i = 10; i < 20; i++){
                try {
                    Log.d("Thread1", "" + i);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    class MyAsync extends AsyncTask {

        @Override
        protected Object doInBackground(Object[] objects) {
            for (int i = 0; i < 10; i++){
                try {
                    Log.d("Thread2", "" + i);
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
    }
}

Вывод:
2022-08-08 15:37:27.543 8374-8419/ D/Thread2: 0 # начало потока через AsyncTask
2022-08-08 15:37:27.544 8374-8420/ D/Thread1: 10 # начало потока через Thread
2022-08-08 15:37:28.547 8374-8420/ D/Thread1: 11
2022-08-08 15:37:28.550 8374-8419/ D/Thread2: 1
2022-08-08 15:37:29.549 8374-8420/ D/Thread1: 12
2022-08-08 15:37:29.554 8374-8419/ D/Thread2: 2
2022-08-08 15:37:30.329 8374-8421/ D/Thread1: 10 # начало второго параллельного потока через Thread
2022-08-08 15:37:30.553 8374-8420/ D/Thread1: 13
2022-08-08 15:37:30.561 8374-8419/ D/Thread2: 3
2022-08-08 15:37:31.333 8374-8421/ D/Thread1: 11
2022-08-08 15:37:31.557 8374-8420/ D/Thread1: 14
2022-08-08 15:37:31.576 8374-8419/ D/Thread2: 4
2022-08-08 15:37:32.337 8374-8421/ D/Thread1: 12
2022-08-08 15:37:32.561 8374-8420/ D/Thread1: 15
2022-08-08 15:37:32.580 8374-8419/ D/Thread2: 5
2022-08-08 15:37:33.340 8374-8421/ D/Thread1: 13
2022-08-08 15:37:33.563 8374-8420/ D/Thread1: 16
2022-08-08 15:37:33.635 8374-8419/ D/Thread2: 6
2022-08-08 15:37:34.030 8374-8422/ D/Thread1: 10 # начало третьего параллельного потока через Thread
2022-08-08 15:37:34.343 8374-8421/ D/Thread1: 14
2022-08-08 15:37:34.570 8374-8420/ D/Thread1: 17
2022-08-08 15:37:34.698 8374-8419/ D/Thread2: 7
2022-08-08 15:37:35.035 8374-8422/ D/Thread1: 11
2022-08-08 15:37:35.347 8374-8421/ D/Thread1: 15
2022-08-08 15:37:35.573 8374-8420/ D/Thread1: 18
2022-08-08 15:37:35.708 8374-8419/ D/Thread2: 8
2022-08-08 15:37:36.040 8374-8422/ D/Thread1: 12
2022-08-08 15:37:36.353 8374-8421/ D/Thread1: 16
2022-08-08 15:37:36.594 8374-8420/ D/Thread1: 19
2022-08-08 15:37:36.726 8374-8419/ D/Thread2: 9
2022-08-08 15:37:37.045 8374-8422/ D/Thread1: 13
2022-08-08 15:37:37.393 8374-8421/ D/Thread1: 17
2022-08-08 15:37:37.775 8374-8424/ D/Thread2: 0 # начало следующего потока через AsyncTask, первый поток завершился
2022-08-08 15:37:38.052 8374-8422/ D/Thread1: 14
2022-08-08 15:37:38.425 8374-8421/ D/Thread1: 18
2022-08-08 15:37:38.845 8374-8424/ D/Thread2: 1
2022-08-08 15:37:39.068 8374-8422/ D/Thread1: 15
2022-08-08 15:37:39.497 8374-8421/ D/Thread1: 19
2022-08-08 15:37:39.914 8374-8424/ D/Thread2: 2
2022-08-08 15:37:40.082 8374-8422/ D/Thread1: 16
2022-08-08 15:37:40.973 8374-8424/ D/Thread2: 3
2022-08-08 15:37:41.100 8374-8422/ D/Thread1: 17
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
@Dmtm
Android
зависит от версии андроида, сначала было многопотоков, потом переделали на один, все равно AsyncTask давно никто не использует

ладно, нашел
Order of execution

When first introduced, AsyncTasks were executed serially on a single background thread. Starting with Build.VERSION_CODES.DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with Build.VERSION_CODES.HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.

If you truly want parallel execution, you can invoke executeOnExecutor(java.util.concurrent.Executor, java.lang.Object[]) with THREAD_POOL_EXECUTOR.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
AsyncTask уже давно не используется.
RxJava или корутины
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы