【问题标题】:Does an Android Looper thread use processing power?Android Looper 线程是否使用处理能力?
【发布时间】:2012-02-04 12:32:17
【问题描述】:
这个问题可能也适用于 Java 线程的一般世界......
我有一个这样使用的线程(这是在run 方法中):
Looper.prepare();
Handler rHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
//ommited...
}
};
Looper.loop();
我的问题是线程在等待将事物推送到处理程序时是否正在使用 CPU?还是真的“睡着了”?
有几个这样的线程会使系统陷入困境吗?
【问题讨论】:
标签:
android
multithreading
looper
【解决方案1】:
在底层,Looper 是 Java 层的一个外观,用于本地代码 Looper 对象(用 C++ 编写)。本机代码循环器利用了 Linux 系统调用“epoll”,这是一种为可扩展性而构建的 I/O 事件通知机制(即,您可以拥有大量它们而对性能影响很小——尽管对内存有一些影响)。这意味着当 Looper 挂在 loop() 并且队列上没有消息时,实际上没有执行任何操作,因此它不使用处理能力(只是一点点内存)。当一条消息被投递到它上面的消息队列时,线程将被“唤醒”并处理该消息。
如果您对代码感兴趣,请参阅:
AOSP_ROOT/frameworks/native/libs/utils/Looper.cpp
AOSP_ROOT/frameworks/base/core/java/android/os/Looper.java
AOSP_ROOT/frameworks/base/core/java/android/os/MessageQueue.java
AOSP_ROOT/frameworks/base/core/jni/android_os_MessageQueue.cpp
AOSP_ROOT/frameworks/base/native/android/looper.cpp
【解决方案2】:
当线程在等待消息时,它还没有准备好运行。未准备好运行的线程不能使用任何 CPU。