Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步任务中的Volatile和Synchronized_Java_Android_Multithreading_Android Asynctask - Fatal编程技术网

Java 异步任务中的Volatile和Synchronized

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?因为我们曾经 只

在AsyncTask(在Android SDK中)的内部实现中,
sDefaultExecutor
volatile
关键字声明,并且
SerialExecutor
中的
execute()
方法用
synchronized
关键字声明

  • 现在,由于AsyncTask只能从UI线程执行,而且如果 我们执行了一个
    AsyncTask
    的实例,但不能执行相同的实例 除非上一个实例已完成执行,否则请再次执行。 那么,这里为什么会出现多线程的情况呢
  • 为什么
    SerialExecutor
    具有
    ArrayDeque
    ?因为我们曾经 只能有一个任务。如果我们创建一个新的
    AsyncTask
    实例, 然后我们会得到一个新的
    ArrayDeque
    实例,它同样只有 要处理的任务是什么
  • ThreadPoolExecutor的情况也是如此。为什么是线程池
    对于
    AsyncTask
    的特定实例,我们可以 只有一项任务?一根线就够了
  • 除非前一个实例已完成执行,否则无法再次执行同一个实例。那么,这里为什么会出现多线程的情况呢

    例如,有主UI线程和执行器线程

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

    并非只有一项任务。串行执行器一次只能执行一个任务,但您可以在主线程中将多个任务排队,然后在执行器线程中逐个执行这些任务

    除了串行执行器之外,还有其他执行器,比如后面提到的线程池执行器

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

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


    TAK队列和多个任务是如何形成的?假设我创建了一个AsyncTask实例并执行了5次。如果其中一个正在运行,则其他4个不会启动。那么,在任何情况下,我如何获得多个任务呢

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

    对于并行执行,只需使用
    executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR,…)

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


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

    TAK和多个任务的队列是如何形成的?假设我创建了一个AsyncTask实例并执行了5次。如果其中一个正在运行,则其他4个不会启动。那么,在任何情况下,我怎样才能得到多个任务呢?好的。由于SerialExecutor是静态的,所以在所有AsyncTask实例中只使用它的一个实例,因此需要一个队列,这也是真的吗?