android Looper 和执行器线程池的区别

问题描述 投票:0回答:3

我正在阅读关于循环器,以及执行器线程池,它们似乎在做完全相同的事情......或者我错过了什么?

java android
3个回答
18
投票

A

Looper
管理线程将运行的任务。它将它们放入队列中,然后线程执行队列中的下一个任务。 Looper 绑定到特定的线程。

Executor
封装了管理任务并将任务分配给不同的线程。如果您的线程池大小固定为 1,那么我认为它在设计上与 Looper 类似,因为它只会将该线程的工作排队。如果您有一个大小 > 1 的线程池,那么它将设法将任务分配给下一个可用于完成工作的线程,或者换句话说,它将在所有线程之间分配任务。

编辑:推荐阅读:http://developer.android.com/reference/java/util/concurrent/package-summary.html

执行者更加灵活。对于 Android,我真正使用 Looper 的唯一一次是尝试使 Handler 从后台线程(甚至可能在 ExecutorService 中)与主线程通信时。例如:

Handler mainThreadHandler = new Handler(Looper.getMainLooper());
mainThreadHandler.post(new Runnable...); //runs on main thread

2
投票

可能需要注意的是,AndroidX 定义了

HandlerExecutor
。 GMS 提供相同的课程。这是一个使用可以在任何循环器上构建的处理程序的执行器。例如,这样我们就可以在 API 级别< 28获得主线程的执行器。


1
投票

我补充一下,android Looper 可以被本机代码使用。 Android Looper系统由Looper类、Handler类、MesseageQueue类组成。一个循环器绑定到一个线程。 从Andorid 4.0开始,MessageQueue由java代码和c代码共同实现,两者是相连的。您可以通过本机代码或java代码向同一个MessageQueue发送消息。

所以差异是:

  1. Looper 很简单,只有一个线程,而 ExecutorThreadPool 则复杂且灵活,有一个或多个线程。

  2. Looper可以方便地被原生代码使用。

此外,Android代码中常用的是Looper和Handler。一些 Android 开发人员更熟悉 Handler 而不是 ExecutorThreadPool。

© www.soinside.com 2019 - 2024. All rights reserved.