异步任务中的java Volatile和Synchronized
在AsyncTask的内部实现中(在Android SDK中)here,sDefaultExecutor
用volatile
关键字声明,并且SerialExecutor
中的execute()
方法用synchronized
关键字声明
- 现在,由于AsyncTask只能从UI线程执行,而且如果
我们执行
AsyncTask
的一个实例,我们不能执行相同的实例 除非上一个实例已完成执行,否则请再次执行。 那么,这里为什么会出现多线程的情况呢李> - 为什么
SerialExecutor
有一个ArrayDeque
?因为我们曾经 只能有一个任务。如果我们创建一个AsyncTask
的新实例, 那么我们会不会得到一个新的ArrayDeque
实例,它同样只有 要处理的任务是什么李> ThreadPoolExecutor
的情况也是如此。为什么是线程池 对于AsyncTask
的特定实例,我们可以 只有一项任务?一根线就够了李>
# 1 楼答案
例如,有主UI线程和执行器线程
不是只有一项任务。串行执行器一次只能执行一个任务,但您可以在主线程中将多个任务排队,然后在执行器线程中逐个执行这些任务
除了串行执行器之外,还有其他执行器,比如后面提到的线程池执行器
你一次只做一项任务的前提是不正确的。线程池执行器对于在不同线程中同时运行多个异步任务非常有用
只能执行一次
AsyncTask
的一个实例。但是您可以发布多个不同的AsyncTask
实例来执行。请注意,这样的发布操作(execute()
等等)是异步的,在异步任务完成之前返回,您可以在UI线程中运行其他代码,包括发布新的异步任务以执行对于并行执行,只需使用
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...)
是的,你的应用程序中只有一个串行执行器,它在所有异步任务之间共享