【发布时间】:2014-09-27 13:59:29
【问题描述】:
最近我参加了一个面试,有人问我一个问题:一个班级可以使用多少个异步任务?通过使用执行方法,您将通过调用 asynctask 来使用。所以类中异步任务的最大限制是向我提出的问题。
这个问题的答案是什么?谁能解释一下有多少以及为什么?
【问题讨论】:
标签: android performance android-activity asynchronous
最近我参加了一个面试,有人问我一个问题:一个班级可以使用多少个异步任务?通过使用执行方法,您将通过调用 asynctask 来使用。所以类中异步任务的最大限制是向我提出的问题。
这个问题的答案是什么?谁能解释一下有多少以及为什么?
【问题讨论】:
标签: android performance android-activity asynchronous
这个问题本身没有任何意义。你可以在一个类中使用任意数量的AsyncTask,如果有限制的话,那就太荒谬了。我猜他的意思是可以同时执行多少个AsyncTask,以及它们是如何执行的,答案是:视情况而定。
AsyncTasks 可以串行或并行执行。默认行为取决于设备的 API 级别。 AsyncTask 的 execute() 的 documentation 说:
注意:此函数将任务安排在一个队列中 取决于平台的后台线程或线程池 版本。首次引入时,AsyncTask 是在一个 单个后台线程。从 DONUT 开始,这已更改为 允许多个任务并行运行的线程池。 启动 HONEYCOMB,任务恢复为单机执行 线程避免由并行引起的常见应用程序错误 执行。如果你真的想要并行执行,你可以使用 executeOnExecutor(Executor, Params...) 这个方法的版本 线程池执行器;但是,请参阅那里的评论以获取有关警告 它的用途。
话虽如此,您可以像这样选择是并行还是串行执行它们:
// Executes the task in parallel to other tasks
asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
// Adds the task to a queue and executes one at a time.
asyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
但是,即使您并行运行任务,同时运行的数量也是有限的。要了解该限制在哪里,您必须查看source code of AsyncTask。
在 Android 4.3 (Jelly Bean) 之前,限制被硬编码为这些值:
private static final int CORE_POOL_SIZE = 5;
private static final int MAXIMUM_POOL_SIZE = 128;
private static final int KEEP_ALIVE = 1;
但在 Android 4.4 中发生了变化,限制的计算取决于设备中使用的处理器:
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
ThreadPoolExecutor 的实现在两种情况下保持不变:
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
所以这应该可以回答你的问题。但是,如果您真的想了解AsyncTask 的工作原理,那么您应该自己研究源代码! This link leads to the AsyncTask implementation on Android 4.4.
【讨论】: