- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在阅读 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)
}
}
}
为什么要选择使用一组执行器?您用它实现了哪些只有一个执行者无法实现的目标?
最佳答案
这只是为他们可能执行的正确工作构建和分配正确的执行者:
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/
Issue 2019/05/09 21:50:07.380 +0800 ERROR [ExecutorManager] [Azkaban] No active executors found
我的问题是:使用 Executors.newFixedThreadPool(1)?? 有意义吗? 。在两个线程(main + oneAnotherThread)场景下使用执行器服务是否高效?正在通过调
我想知道,Executors.newSingleThreadExecutor() 之间有什么区别?和 Executors.newFixedThreadPool(1) 以下摘自javadoc Unlik
我的问题是:使用 Executors.newFixedThreadPool(1) 有意义吗??。在两个线程(main + oneAnotherThread)场景中使用执行器服务是否有效?通过调用 ne
我有一个 Apache Spark 应用程序在集群模式下运行在 YARN 集群上(spark 在这个集群上有 3 个节点)。 当应用程序运行时,Spark-UI 显示 2 个执行程序(每个运行在不同的
我想知道是否有任何理由使用 Executor 而不是 ExecutorService。 据我所知,JDK 中没有实现 Executor 接口(interface),它也不是 ExecutorServi
我有多个使用 Celery Executor 的 dag,但我希望使用 Kubernetes Executor 运行一个特定的 dag。我无法推断出一种良好而可靠的方法来实现这一目标。 我有一个 ai
假设我们的 Controller 中有一个 Action 。在每次请求时,许多用户都会调用 performLogin。 def performLogin( ) = { Async {
创建和管理您自己的 ExecutorService 与使用 Spring Boot 的 @Async 方法和 @Bean 方法创建 Executor 添加一个@Bean来创建一个Executor 手动
问题从无到有,只有我在代码中所做的更改 - 安装了 RaSharper(但删除它并重新安装 Visual Studio 没有帮助)。 所以我使用 NUnit 3 来运行测试。 我有 Visual St
我们知道每个任务当时都在一个核心中执行。 假设我们有这样配置的节点集群: 10 节点。 每个节点 16 个核心。 每个节点 64 GB 内存。 我的问题是 有 1 个 16 核的执行程序和 16 个
我正在从 Jupyter Notebook 中初始化 PySpark,如下所示: from pyspark import SparkContext # conf = SparkConf().setAp
我正在向我的 Web 应用程序添加一个基于 Flask 的 API,以控制某些网络自动化功能的启动和停止。我遇到了一个奇怪的行为,即 Flask-Executor .submit() 方法调用的函数似
单元测试在本地运行良好。 在 Visual Studio 2017 托管生成代理上运行时,VSTest 任务失败并显示: 2018-12-08T10:42:16.3779907Z An excepti
我正在尝试制作一个执行器和线程的简单示例。 当我调用 newSingleThreadExecutor(new CustomThreadFactory) 时,一切顺利,但是当我使用 null 参数调用
对于一个线程,我通过以下代码段捕获未捕获的异常。但是,对于 ExecutorService executor = Executors.newFixedThreadPool(10);,如何捕获未捕获的异
我想创建一个 CompletableFuture,其返回值在 Kotlin 中的特定执行程序上运行。 下面的代码工作得很好。 return CompletableFuture.supplyAsync
考虑基本的固定线程池: Executors.newFixedThreadPool(MaxListeners) 我打算不断提交新任务 - 响应传入的 TCP 套接字服务请求。 然而,当每个任务中的Run
我们可以在定义 ThreadPoolExecutors 时提供 BlockingQueue 实现。但是,如果我使用工厂(执行器)创建单个线程池(如下所示),我想知道使用哪个阻塞队列。我猜它是一个 Li
我编写了一个程序来执行两个在 shell 前台运行的命令,直到在终端上按下 ^c。 外壳命令 ./weed master -mdir=/var/lib/qualebs/weed 上面命令的输出是 qu
我是一名优秀的程序员,十分优秀!