Dif*_*ffy 5 java multithreading android android-asynctask
在内部实现的AsyncTask的(在Android SDK中)在这里,sDefaultExecutor都被定义为volatile关键字,也execute()方法SerialExecutor与声明的synchronized关键字.
AsyncTask,除非前一个实例已经完成执行,否则我们不能再次执行相同的实例.那么怎么会有多线程的情况呢?SerialExecutor有一个ArrayDeque?因为我们一次只能完成一项任务.如果我们创建一个新的实例AsyncTask,那么我们不会再获得一个新的实例ArrayDeque,它只有一个Task要处理?ThreadPoolExecutor.为什么在特定实例时需要线程池AsyncTask,我们只能有一个Task?一个线程就足够了.除非前一个实例已完成执行,否则我们无法再次执行同一个实例。那么这里怎么会出现多线程的情况呢?
例如,有主 UI 线程和执行程序线程。
为什么SerialExecutor有一个ArrayDeque?因为一次我们只能完成一项任务。如果我们创建一个新的 AsyncTask 实例,那么我们是否会得到一个新的 ArrayDeque 实例,它也只有一个任务需要处理?
只能有一项任务是不正确的。串行执行器一次只能执行一项任务,但您可以在主线程中将多个任务排队,然后在执行器线程中一项一项地执行。
除了串行执行器之外,还有其他执行器,例如您稍后提到的线程池执行器。
ThreadPoolExecutor 的情况也是如此。为什么对于 AsyncTask 的特定实例,我们只能有一个任务时需要线程池?一个线程就足够了。
您一次只能完成一项任务的前提是不正确的。线程池执行器对于在单独的线程中同时运行多个异步任务非常有用。
任务和多个任务的排队是如何出现的?假设我创建一个 AsyncTask 实例并执行 5 次。那么如果其中一个正在运行,其他 4 个就不会启动。那么在任何情况下我怎样才能获得多个任务呢?
您只能执行一次一个实例AsyncTask。但您可以发布多个不同的AsyncTask执行实例。请注意,此类发布操作(execute()等等)是异步的,并在异步任务完成之前返回,并且您可以在 UI 线程中运行其他代码,包括发布新的异步任务以供执行。
对于并行执行,只需使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ...).
由于 SerialExecutor 是静态的,因此所有 AsyncTask 实例中只会使用它的一个实例,因此需要一个队列,这也是真的吗?
是的,您的应用程序中只有一个串行执行器,并且在所有异步任务之间共享。
| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |