Java 异步任务中的Volatile和Synchronized
在AsyncTask(在Android SDK中)的内部实现中,Java 异步任务中的Volatile和Synchronized,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,在AsyncTask(在Android SDK中)的内部实现中,sDefaultExecutor用volatile关键字声明,并且SerialExecutor中的execute()方法用synchronized关键字声明 现在,由于AsyncTask只能从UI线程执行,而且如果 我们执行了一个AsyncTask的实例,但不能执行相同的实例 除非上一个实例已完成执行,否则请再次执行。 那么,这里为什么会出现多线程的情况呢 为什么SerialExecutor具有ArrayDeque?因为我们曾经 只
sDefaultExecutor
用volatile
关键字声明,并且SerialExecutor
中的execute()
方法用synchronized
关键字声明
AsyncTask
的实例,但不能执行相同的实例
除非上一个实例已完成执行,否则请再次执行。
那么,这里为什么会出现多线程的情况呢SerialExecutor
具有ArrayDeque
?因为我们曾经
只能有一个任务。如果我们创建一个新的AsyncTask
实例,
然后我们会得到一个新的ArrayDeque
实例,它同样只有
要处理的任务是什么ThreadPoolExecutor的情况也是如此。为什么是线程池
对于AsyncTask
的特定实例,我们可以
只有一项任务?一根线就够了
TAK队列和多个任务是如何形成的?假设我创建了一个AsyncTask实例并执行了5次。如果其中一个正在运行,则其他4个不会启动。那么,在任何情况下,我如何获得多个任务呢 只能执行一次
异步任务的一个实例。但是您可以发布多个不同的AsyncTask
实例来执行。请注意,此类发布操作(execute()
等)是异步的,在异步任务完成之前返回,并且您可以在UI线程中运行其他代码,包括发布新的异步任务以执行
对于并行执行,只需使用executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,…)
由于SerialExecutor是静态的,所以在所有AsyncTask实例中只使用它的一个实例,因此需要一个队列,这也是真的吗
是的,您的应用程序中只有一个串行执行器,它在所有异步任务之间共享。TAK和多个任务的队列是如何形成的?假设我创建了一个AsyncTask实例并执行了5次。如果其中一个正在运行,则其他4个不会启动。那么,在任何情况下,我怎样才能得到多个任务呢?好的。由于SerialExecutor是静态的,所以在所有AsyncTask实例中只使用它的一个实例,因此需要一个队列,这也是真的吗?