【问题标题】:AsyncTask thread still there after execute, is that normal?执行后 AsyncTask 线程还在,这正常吗?
【发布时间】:2011-07-15 23:07:57
【问题描述】:

当我在 DDMS 中使用 AsyncTasks 检查时,线程在 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");
     }

}

}

【问题讨论】:

    标签: java android multithreading thread-safety android-asynctask


    【解决方案1】:

    AsyncTask 使用“线程池”技术。您启动的每个 AsyncTask 都会进入一个队列; “池”中有一些空闲线程(或根据需要创建到一定限制)等待任务。池中的空闲线程获取您的 AsyncTask 并执行它,然后返回到池中。然后重复该过程,直到队列中没有更多任务为止。

    这种方法有两个重要特点:

    1. 没有每次创建线程的开销
    2. 如果大量任务系统性能下降优雅:大部分任务将在队列中等待,只有少数任务会 一次执行;最终他们都会被处决。 否则,如果为每个任务启动了单独的线程,则 系统可能会耗尽内存或线程,或者任务将占用 永远结束。

    您在 AsyncTask 完成后在 DDMS 中看到的线程是池中的空闲线程。

    【讨论】:

      【解决方案2】:

      是的,这避免了在提交下一个 AsyncTask 时杀死和重新启动线程的开销

      如果您在第一个 AsyncTask 完成后提交另一个 AsyncTask,则会重复使用相同的线程

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-30
          • 2022-12-04
          • 2021-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多