【问题标题】:asynctask WAIT mode异步任务等待模式
【发布时间】:2014-10-09 07:28:13
【问题描述】:

当我在 UI 上按下 button1(执行)时,我运行 AsyncTask。任务运行成功。

我按下另一个按钮2(取消)以从主线程停止异步任务

asynctask.cancel(true);

但是 AsyncTask 线程不会自我杀死! (见第二个截图) asynctask 切换到 WAIT 模式

然后我可以再次按下按钮 1(执行)并运行新任务并按下按钮 2(取消)

我有疑问:

为什么在使用 cancel(true) 后任务不执行 selfkill? 为什么是等待模式?

【问题讨论】:

    标签: android-asynctask wait kill


    【解决方案1】:

    AsyncTask 在底层使用 ThreadPoolExecutor。这些线程可能暂时不会消失,因为过于频繁地创建和拆除这些线程是一种浪费。一段时间后,如果您创建更多 AsyncTasks,您会发现它会停止创建新线程并重新使用旧线程。

    更新以解决一些细节:

    您会认为如果池中有空闲线程,它就不会创建新线程,但事实并非如此。这个想法是有一定数量的线程可以用来继续处理异步任务。这称为核心池大小。在 Android 的 AsyncTask 案例中,他们似乎已将其设置为 5。如果您查看 ThreadPoolExecutor 的文档,它会说:

    When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle.
    

    还有一个最大值恰当地称为最大池大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 2014-09-06
      • 2013-02-10
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 2018-04-04
      相关资源
      最近更新 更多