如果在Android中使用不同参数多次调用相同的AsyncTask会发生什么

时间:2017-04-04 06:31:02

标签: android multithreading android-asynctask

我对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。现在我的问题是,上面的代码会发生什么?所有AsyncTasks是并行还是顺序执行?如果他们并行执行怎么办?如果他们顺序执行怎么样?我想要一个明确的解释。如果有人知道请告诉我。

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

[同时运行多个AsyncTasks - 不可能?

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 1}}。

延迟队列大小

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