这个问题可能也适用于Java线程的一般世界......
我有一个我使用的线程(这是在run
方法中):
Looper.prepare();
Handler rHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
//ommited...
}
};
Looper.loop();
我的问题是线程是否在等待将事物推送到处理程序时使用CPU?还是真的“睡觉”了?
可以让几个这样的线程陷入困境吗?
答案 0 :(得分:5)
在引擎盖下,Looper是Java层的外观,用于本机代码Looper对象(用C ++编写)。本机代码looper利用Linux系统调用“epoll”,这是一种为可伸缩性而构建的I / O事件通知机制(即,您可以使用大量的内容而对性能影响很小 - 但会产生一些内存影响)。这意味着当Looper在循环()中挂出并且队列中没有消息时,实际上没有任何内容正在执行,因此它不使用处理能力(只是一点点内存)。当消息发布到消息队列中时,该线程将被“唤醒”并处理该消息。
如果您对代码感兴趣,请参阅:
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
答案 1 :(得分:0)
当线程正在等待消息时,它还没有准备好运行。未准备好运行的线程无法使用任何CPU。