AsyncTask中的易失性和同步

Dif*_*ffy 5 java multithreading android android-asynctask

在内部实现的AsyncTask的(在Android SDK中)在这里,sDefaultExecutor都被定义为volatile关键字,也execute()方法SerialExecutor与声明的synchronized关键字.

  1. 现在,因为AsyncTask只能从UI线程执行,而且如果我们执行一个实例AsyncTask,除非前一个实例已经完成执行,否则我们不能再次执行相同的实例.那么怎么会有多线程的情况呢?
  2. 为什么SerialExecutor有一个ArrayDeque?因为我们一次只能完成一项任务.如果我们创建一个新的实例AsyncTask,那么我们不会再获得一个新的实例ArrayDeque,它只有一个Task要处理?
  3. 情况也是如此ThreadPoolExecutor.为什么在特定实例时需要线程池AsyncTask,我们只能有一个Task?一个线程就足够了.

laa*_*lto 2

除非前一个实例已完成执行,否则我们无法再次执行同一个实例。那么这里怎么会出现多线程的情况呢?

例如,有主 UI 线程和执行程序线程。

为什么SerialExecutor有一个ArrayDeque?因为一次我们只能完成一项任务。如果我们创建一个新的 AsyncTask 实例,那么我们是否会得到一个新的 ArrayDeque 实例,它也只有一个任务需要处理?

只能有一项任务是不正确的。串行执行器一次只能执行一项任务,但您可以在主线程中将多个任务排队,然后在执行器线程中一项一项地执行。

除了串行执行器之外,还有其他执行器,例如您稍后提到的线程池执行器。

ThreadPoolExecutor 的情况也是如此。为什么对于 AsyncTask 的特定实例,我们只能有一个任务时需要线程池?一个线程就足够了。

您一次只能完成一项任务的前提是不正确的。线程池执行器对于在单独的线程中同时运行多个异步任务非常有用。

任务和多个任务的排队是如何出现的?假设我创建一个 AsyncTask 实例并执行 5 次。那么如果其中一个正在运行,其他 4 个就不会启动。那么在任何情况下我怎样才能获得多个任务呢?

您只能执行一次一个实例AsyncTask。但您可以发布多个不同的AsyncTask执行实例。请注意,此类发布操作(execute()等等)是异步的,并在异步任务完成之前返回,并且您可以在 UI 线程中运行其他代码,包括发布新的异步任务以供执行。

对于并行执行,只需使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...).

由于 SerialExecutor 是静态的,因此所有 AsyncTask 实例中只会使用它的一个实例,因此需要一个队列,这也是真的吗?

是的,您的应用程序中只有一个串行执行器,并且在所有异步任务之间共享。