Android Looper线程是否使用处理能力?

时间:2012-01-06 19:50:01

标签: android multithreading looper

这个问题可能也适用于Java线程的一般世​​界......

我有一个我使用的线程(这是在run方法中):

Looper.prepare();

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

Looper.loop();

我的问题是线程是否在等待将事物推送到处理程序时使用CPU?还是真的“睡觉”了?

可以让几个这样的线程陷入困境吗?

2 个答案:

答案 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。