在AsyncTask的内部实现中(在Android SDK中)here,sDefaultExecutor
使用volatile
关键字声明,execute()
中的SerialExecutor
方法也被声明使用synchronized
关键字。
AsyncTask
的实例,我们不能执行相同的操作
除非前一个实例已完成执行,否则再次执行
那么怎么会有多线程的情况呢?SerialExecutor
有ArrayDeque
?因为我们一度
只能有一个任务。如果我们创建AsyncTask
的新实例,
然后,我们不会再获得ArrayDeque
的新实例,只有。{1}}
一个要处理的任务?ThreadPoolExecutor
的情况也是如此。为什么线程池
对于AsyncTask
的特定实例,我们可以拥有
只有一个任务?一个线程就足够了。答案 0 :(得分:2)
除非先前的实例已经完成执行,否则我们无法再次执行相同的实例。那么怎么会有多线程的情况呢?
例如,有主要的UI线程和执行程序线程。
为什么SerialExecutor有一个ArrayDeque?因为我们一次只能完成一项任务。如果我们创建一个AsyncTask的新实例,那么我们不会再获得一个新的ArrayDeque实例,它只有一个Task要处理?
不可能只有一项任务。串行执行器一次只能执行一个任务,但您可以在主线程中排队多个任务,并在执行程序线程中逐个执行。
还有其他执行程序,而不是串行执行程序,就像你稍后提到的线程池执行程序一样。
ThreadPoolExecutor的情况也是如此。为什么对于AsyncTask的特定实例需要线程池,我们只能有一个Task?一个线程就足够了。
您一次只能执行一项任务的前提是不正确的。线程池执行程序对于在单独的线程中同时运行多个异步任务非常有用。
排队和多项任务的排队如何形成?假设我创建了一个AsyncTask实例并执行了5次。然后,如果一个正在运行,其他4不会启动。那么我怎样才能在任何情况下获得多项任务?
您只能执行一次AsyncTask
的实例。但是您可以发布多个AsyncTask
的不同实例来执行。请注意,此类发布操作(execute()
等)是异步的,并在异步任务完成之前返回,并且您可以在UI线程中运行其他代码,包括发布新的异步任务以供执行。 / p>
对于并行执行,只需使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...)
。
由于SerialExecutor是静态的,所以在所有AsyncTask实例中只使用它的一个实例,因此需要一个队列吗?
是的,您的应用中只有一个串行执行器,并且它在所有异步任务之间共享。