gpt4 book ai didi

android - 什么时候以及为什么要使用一组 Executor

转载 作者:太空狗 更新时间:2023-10-29 13:03:30 26 4
gpt4 key购买 nike

我一直在阅读 Android 文档中有关 Executor 的内容。如果我理解正确的话,它用于多线程管理,它会为您完成一些工作,比如在需要时生成新线程。或者您可以选择自己管理内容。

在下面的示例中,使用了一组执行器而不是一个。所以它有点像线程池(?)。

/**
* Global executor pools for the whole application.
*
* Grouping tasks like this avoids the effects of task starvation (e.g. disk
reads don't wait behind
* webservice requests).
*/
@Singleton
open class AppExecutors(
private val diskIO: Executor,
private val networkIO: Executor,
private val mainThread: Executor
) {

@Inject
constructor() : this(
Executors.newSingleThreadExecutor(),
Executors.newFixedThreadPool(3),
MainThreadExecutor()
)

fun diskIO(): Executor {
return diskIO
}

fun networkIO(): Executor {
return networkIO
}

fun mainThread(): Executor {
return mainThread
}

private class MainThreadExecutor : Executor {
private val mainThreadHandler = Handler(Looper.getMainLooper())
override fun execute(command: Runnable) {
mainThreadHandler.post(command)
}
}
}

为什么要选择使用一组执行器?您用它实现了哪些只有一个执行者无法实现的目标?

最佳答案

这只是为他们可能执行的正确工作构建和分配正确的执行者:

  1. 它很好地放在一个类中以便于重用。
  2. 使用了三种类型的执行器,每种执行器都可以运行一种特定类型的任务。请记住,执行者有线程来执行作业或 Runnable,并且执行者创建的每个线程一次可以运行一个作业:
    • diskIO 是(来自 constrcutor)一个 Executors.newSingleThreadExecutor() 因为任务最好排队并一次执行一个例如,减少写入和读取锁或竞争条件。因此,SingleThreadExecutor 将一次只运行一个任务,无论有多少任务排队以确保该设计。作为单线程也可能意味着它被用于将应用程序日志写入文件,例如允许日志以正确的顺序写入提交给执行程序。因此,单线程最适合按照作业排队的顺序维护输出。
    • networkIO 是一个 Executors.newFixedThreadPool(3),因为任务通常与网络相关,例如连接到 Internet 上的服务器并执行请求或获取数据。这些任务通常会让用户等待(可能在几秒到几分钟之间),并且需要并行且快速地执行以缩短等待时间,以防需要同时执行许多请求。因此,这个执行器使用 3 个线程的原因是在它们之间分配任务并一起执行。作业的顺序在这里不是问题,因为作业需要不同的时间来执行,但最重要的是它们并行运行。
    • mainThread 是一个 MainThreadExecutor(),它在 Android 应用程序中处理 UI 并绘制它。 UI 应该运行流畅而不滞后,因此使用上述两个执行程序的原因是让任何繁重的任务(如编写文件或执行请求)在后台运行或与 mainThread 分开运行的应用程序。即使应用程序没有向它提交任何任务,该执行器也会继续执行任务。它不断执行的任务是在不断重复的屏幕上连续绘制 UI。 mainThread 执行的任务需要轻量和快速(它们花费的时间以毫秒为单位),因此任何减慢它的任务都会被注意到,因为 UI 会滞后或出现故障,因为mainThread 正忙于完成该任务,而不是绘制和更新 UI。 mainThread 这里简单地使用了一个 Handler,它是 Android SDK/架构的一部分,是单线程类型并且表现得像一个对任务进行排队的执行器(有一些不同)创建/更新 UI。只有 Handler 可以执行 UI 任务,其他执行器都不能。

关于android - 什么时候以及为什么要使用一组 Executor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52173972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com