Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 Android并发使用_Java_Android_Multithreading_Concurrency - Fatal编程技术网

Java Android并发使用

Java Android并发使用,java,android,multithreading,concurrency,Java,Android,Multithreading,Concurrency,Android有很多不同的功能,可以同时在不同的线程上执行代码。 但我不确定什么时候应该使用每一种方法,也不确定这些不同方法的最佳实践是什么 何时/为什么应使用处理程序 何时/为什么应使用装载机 何时/为什么应使用AsyncTasks 何时/为什么应使用FutureTask 何时/为什么应使用执行人 何时/为什么应使用线程/可运行程序 什么时候/为什么应该使用截击 我错过什么了吗 非常感谢你的帮助 您有一个相当大的组件列表,每个组件处理的内容略有不同。在我的经验中,两个主要的冲突实际上是处理程序

Android有很多不同的功能,可以同时在不同的线程上执行代码。 但我不确定什么时候应该使用每一种方法,也不确定这些不同方法的最佳实践是什么

  • 何时/为什么应使用处理程序

  • 何时/为什么应使用装载机

  • 何时/为什么应使用AsyncTasks

  • 何时/为什么应使用FutureTask

  • 何时/为什么应使用执行人

  • 何时/为什么应使用线程/可运行程序

  • 什么时候/为什么应该使用截击

  • 我错过什么了吗


    非常感谢你的帮助

    您有一个相当大的组件列表,每个组件处理的内容略有不同。在我的经验中,两个主要的冲突实际上是处理程序与执行程序之间的冲突,以及任务与线程之间的冲突

    概述 线程 线程是用于促进并发的底层系统机制。线程存在于Windows、Unix等系统中,可以以系统认为合适的任何方式实现。创建线程通常非常昂贵(创建全新的进程更是如此)。我不知道Dalvik VM是依赖Linux线程还是提供自己的线程实现。根据这一点,Dalvik VM只是使用Linux线程模型来实现线程。然而,Dalvik VM不符合Java语言规范在Android 4.0之前的内存模型

    您可能知道,由于创建线程的成本很高,因此安排大量异步计算的更好方法是使用托管线程池(大小取决于底层硬件的功能),并将任务简单地馈送给管理器,然后管理器在线程可用时安排线程上的任务

    安卓处理器 据我所知,安卓开发的历史可以追溯到Java Executor库/api固化之前。为了提供一个比旧线程和同步方法更少混乱的并发接口,并以一种良好的方式促进线程之间的消息传递,Android引入了处理程序。然而,除非我理解不正确,否则处理程序和执行者基本上是一样的。您将消息(包含可运行项)或简单的可运行项传递给处理程序,这些消息以处理程序线程所能达到的速度排队和执行。。处理它们

    线程池 在Android中,线程之间的所有通信都是(或应该)通过线程的处理程序完成的(据我所知,不包括直接访问另一个线程的情况,可能需要内存和同步)。在新Java中,执行器在功能上等同于处理程序,FutureTasks等同于消息。可运行的仍然是可运行的。当只需要执行代码时,使用Runnable。当需要异步执行计算并且需要从计算中检索结果时,使用FutureTask。结果可以由任何类型的对象来确定。因为FutureTask实现了Future接口,所以您也可以很容易地在一个线程中等待将来解析并获得结果

    装载机 加载程序只是试图提供一种可重用的机制来加载数据(由活动使用)。尽管有文档,Loader类并不是抽象的,也不需要仅用于异步数据采集(尽管我想不出有哪种情况会将其用于同步加载,但我还没有对此进行探讨)。AsyncTaskLoader只是使用AsyncTask来执行加载程序中负责加载数据的方法。根本不需要装载机

    例子 线程 线程应该用于支持执行器或处理程序,或者在其他情况下,您将知道何时需要线程(例如支持服务)。对于以自由方式创建、执行和销毁的小任务,通常应该避免线程

    处理者与执行者 根据我的经验,在处理UI线程(运行活动和/或视图层次结构)和其他线程之间的消息传递时,使用处理程序似乎更好。但是,在实现自己的异步功能时,使用执行器或处理程序似乎是完全安全的。例如,我可能有一个类来管理从服务器获取的图像队列。我可以简单地创建自己的执行者,并在我认为合适的情况下将任务提供给该执行者。但是,当将消息传递回其中一个映像已加载的活动并且视图应设置为结果数据时,我使用活动的处理程序(通过
    runOnUiThread()
    方法访问)获得了最佳结果,而不是创建在活动线程上运行的执行器并向其发布runnable。不清楚为什么后者不能一直工作(即从文档中),但我怀疑这样做可能会导致类似于处理程序的
    runWithCissor()
    方法的行为。(编辑,我现在意识到在一个线程上运行多个并发“循环器”是非常糟糕的做法——这就解释了这一点。)

    我想一个好的经验法则可能是:

    • 在Android组件之间传递消息时使用处理程序
    • 在实现自己的库或实用程序功能时使用执行器或处理程序
    可运行任务vs未来任务vs异步任务 如前所述,Runnable是用于在对象之间传递计算的简单接口。您不需要仅在涉及线程/执行器/处理程序时才使用可运行程序——它们可以用于捕获状态和重用代码

    • Runnables和FutureTasks与执行器一起使用
    • 异步任务(隐式)与处理程序一起使用。构造AsyncTask时,提供对活动的引用,AsyncTask类有助于doInBackground met的执行