我对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是并行还是顺序执行?如果他们并行执行怎么办?如果他们顺序执行怎么样?我想要一个明确的解释。如果有人知道请告诉我。
提前致谢。
答案 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个任务。