2012-01-06 28 views
1

这个问题很可能也适用于Java线程的一般的世界......Android Looper线程是否使用处理能力?

我有我使用像这样(这是在run法)线程:

Looper.prepare(); 

Handler rHandler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     //ommited... 
    } 
}; 

Looper.loop(); 

我的问题是当线程正在等待事件被推送到处理程序时,线程是否正在使用CPU?还是真的“睡觉”?

可以有几个这样的线程陷入系统?

回答

3

在底层,Looper是Java层的本地代码Looper对象(用C++编写)的外观。本地代码looper利用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 
0

当线程正在等待消息时,它尚未准备好运行。未准备好运行的线程不能使用任何CPU。

相关问题