执行后AsyncTask线程仍然存在,这正常吗?

6
当我在DDMS中使用AsyncTasks检查时,在onPostExecute()方法之后,该线程会作为等待线程继续停留在内存中,这是正常的吗?以下是一个简化的Activity,可以复现我的问题:
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
AsyncTask使用“线程池”技术。每个启动的AsyncTask都进入队列中;在“池”中有一些空闲线程(或根据需要创建到某个限制为止),等待任务。来自池中的空闲线程获取您的AsyncTask并执行它,然后返回到池中。然后该过程重复,直到队列中没有更多任务。
这种方法具有两个重要特点:
1. 每次创建线程时没有额外开销。 2. 在大量任务的情况下,系统性能会优雅地降低:大多数任务将等待在队列中,只有少数任务会同时执行;最终所有任务都将被执行。否则,如果为每个任务启动单独的线程,则系统可能会耗尽内存或线程,或者任务将永远无法完成。
您在AsyncTask完成后在DDMS中看到的线程是池中的空闲线程。

3

是的,这避免了在提交下一个AsyncTask时终止和重新启动线程所带来的开销。

如果在第一个AsyncTask完成后提交另一个AsyncTask,则将重用同一线程。


0

这里提供的两个答案都是正确的。除此之外,线程池中这些线程的状态将会是“等待”。当使用像 Okhttp 这样的库进行网络操作时,也可以观察到这种现象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接