阅读本指南,了解如何分析直接从相机馈送的图像;在页面底部的代码示例中突然弹出一个新变量
executor
:
imageAnalysis.setAnalyzer(executor, ImageAnalysis.Analyzer { imageProxy ->
查了一下,Executor只是另一种并行化抽象。现在,我如何获得一个?有这样的事吗
androidThreadPool.getExecutor()
实际上,我找到了一个:
Context.getMainExecutor()
如果我理解正确的话,这将在主线程上执行 Runnable。但是,我认为向 ImageAnalyzer 提供 Executor 的目的是而不是在主线程上运行它。
或者我必须创建自己的执行器吗?这是常见做法吗?
执行器只是另一种并行化抽象
不,不是“只是另一个”。 Executors 框架是 Java 发展过程中的一个重要里程碑。这个框架减轻了 Java 程序员管理线程的负担,使并发工作变得更加简单。
ExecutorService
,不是Executor
Executor
界面是不是最常用的部分。该接口定义了 execute
方法,该方法可以在后台线程上运行您的任务,也可以在当前线程上运行该任务。
如果您知道需要后台线程,请使用
ExecutorService
接口及其方法(如 submit
)的实现。
如何获得
通常,我们通过调用 ExecutorService
类上的便捷工厂方法来获得
Executors
的未指定实现。
您可能需要一个由任意数量的线程池支持的执行程序服务。仅当您知道同时执行的任务数量有限时才使用此选项,以免机器负担过重。
ExecutorService es = Executors.newCachedThreadPool() ;
您可能需要一个由一定数量的线程池支持的执行程序服务。
ExecutorService es = Executors.newFixedThreadPool( maxThreadsCount ) ;
在现代 Java 21+ 版本中,我们可能会使用 虚拟线程 来实现大多数目的。我认为 Android 不提供虚拟线程,而且很快也不会提供。
ExecutorService es = Executors.newVirtualThreadPerTaskExecutor() ;
这些执行器服务中的任何一个都可以运行您定义为
Runnable
或 Callable
的任务。
或者我必须创建自己的执行器吗?
不,这种情况非常罕见,您需要自定义执行器服务。
[创建我自己的执行者]这样做是常见做法吗?
没有。
执行器框架的目的是避免处理线程和任务的低级细节。
ExecutorService
的几个良好实现与 Java 捆绑在一起,通过 Executors
类提供给您。
警告:我不了解 Android。我这里的评论适用于 Java 平台。我的评论可能也适用于Android;我只是不知道。