【问题标题】:What happens if same AsyncTask is called multiple times with different parameter in Android如果在 Android 中使用不同的参数多次调用同一个 AsyncTask 会发生什么
【发布时间】:2017-04-04 06:31:02
【问题描述】:

我有一个关于 AsyncTask 的问题。如果我使用像这样的不同字符串值调用相同的 AsyncTask

 next.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
              new MyAsyncTask().execute("Android");
new MyAsyncTask().execute("Java");
new MyAsyncTask().execute("Hadoop");
new MyAsyncTask().execute("Python");
new MyAsyncTask().execute("Dot Net");
new MyAsyncTask().execute("Hibernate");
        }
    });

我使用单个按钮单击调用具有不同值的相同 AsyncTask。现在我的问题是,上面的代码会发生什么?所有的 AsyncTask 是并行执行还是顺序执行?如果它们并行执行如何?如果它们按顺序执行如何?我想要一个清楚的解释。有知道的请告诉我。

提前致谢。

【问题讨论】:

  • 我强烈建议您阅读 Asynctask 的用法及其工作原理。Asynctask 旨在处理线程操作,它取决于您的 ThreadPoolSize 以及可以并行运行的异步任务的数量。
  • 如果你必须传递多个参数然后使用变量而不是这个java 字符串并根据你的条件将字符串分配给变量

标签: android multithreading android-asynctask


【解决方案1】:

AsyncTask 使用线程池模式来运行来自doInBackground() 的内容。问题最初是(在早期的 Android 操作系统版本中)池大小仅为 1,这意味着对于一堆 AsyncTasks 没有并行计算。但后来他们修复了这个问题,现在大小为 5,所以最多 5 个AsyncTasks 可以同时运行。

在以下链接中查找更多详细信息:

[同时运行多个 AsyncTask — 不可能?

Multiple AsyncTask In Android ]2

线程池模式

AsyncTask 使用线程池模式运行来自doInBackground() 的东西

线程池模式是创建多个线程来执行多个任务的地方。它基本上是一个容器,多个线程进入队列以执行不同的任务。

Android 中的多个AsyncTasks

在早期版本的 Android (Donut and below) 中,不允许多个 AsyncTasks 执行。池大小只有1。但是Donut (1.6)之后放宽了,现在大小是5,所以最多5个AsyncTasks可以同时运行。

AsyncTask的限制

可以同时运行多少个任务是有限制的。由于AsyncTask 使用具有最大工作线程数 (128) 的线程池执行器,并且延迟任务队列的大小固定为 10。如果您尝试执行超过 138 个AsyncTasks,则应用程序将因java.util.concurrent.RejectedExecutionException 而崩溃。

延迟队列大小

AsyncTasks 在内部使用固定大小的队列来存储延迟任务。队列大小默认为 10。如果您连续启动 15 个AsyncTasks,那么前 5 个将进入他们的doInBackground(),但其余的将在队列中等待空闲的工作线程。只要前 5 个AsyncTasks 中的任何一个完成并因此释放一个工作线程,队列中的一个任务就会开始执行。所以在这种情况下,最多 5 个任务将同时运行。但是,如果您连续启动 16 个自定义任务,那么前 5 个将进入他们的doInBackground(),其余 10 个将进入队列,但对于第 16 个,将创建一个新的工作线程,因此它将立即开始执行.所以在这种情况下,最多 6 个任务会同时运行。

【讨论】:

  • ok 大小为 5 表示,如果我运行超过 5 个 asynctask 那么会发生什么?如果我运行 10 意味着,前 5 个同时执行,接下来的 5 个将同时执行.. 对吗??
  • 阅读第二个链接,它包含有关 ,Multiple AsyncTasks In AndroidLimitation Of AsyncTaskDelayed Queue Size 的完整信息
猜你喜欢
  • 2017-01-19
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2011-11-06
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多