Поток AsyncTask все еще существует после выполнения, это нормально? - PullRequest
6 голосов
/ 16 июля 2011

когда я использую проверку AsyncTasks в DDMS, поток сохраняется в памяти как ожидающий поток после метода onPostExecute (), это нормально? Вот упрощенное задание, воспроизводящее мою проблему:

package com.example.async;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class ASyncTaskExampleActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new ExampleAsyncTask().execute();
}


private class ExampleAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        for (int i =0; i<50000;i++){
            int j=i*2;
        }
        return null;
    }

    protected void onPostExecute(Void result) {
        Log.d("Test","End onPostExecute");
     }

}

}

Ответы [ 3 ]

7 голосов
/ 16 июля 2011

AsyncTask использует технику "пула потоков". Каждый AsyncTask, который вы запускаете, попадает в очередь; в пуле есть несколько свободных потоков (или они создаются по мере необходимости до определенного предела), ожидающих выполнения задач. Свободный поток из пула берет ваш AsyncTask и выполняет его, а затем возвращается в пул. Затем процесс повторяется до тех пор, пока в очереди не останется больше задач.

Этот подход имеет 2 важных особенности:

  1. нет затрат на создание потока каждый раз
  2. в случае огромного числа задач, производительность системы снижается изящно : большинство задач будут ждать в очереди, и лишь немногие из них будут быть исполненным за один раз; в конце концов все они будут казнены. В противном случае, если для каждой задачи был запущен отдельный поток, системе, скорее всего, не хватит памяти или потоков, или задачи навсегда до конца.

Поток, который вы видите в DDMS после завершения AsyncTask, является свободным потоком в пуле.

3 голосов
/ 16 июля 2011

Да, это позволяет избежать накладных расходов на уничтожение и перезапуск потока при отправке следующей AsyncTask

если вы отправите другой AsyncTask после завершения первого, тот же поток будет использован для него повторно

0 голосов
/ 04 января 2017

Оба ответа здесь верны. Кроме того, состояние таких потоков в пуле будет «ждать». Это явление также может наблюдаться при использовании таких библиотек, как Okhttp, которые используют пул соединений для сетевых операций.

...