1

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

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

Looper.prepare();

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

Looper.loop();

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

有几个这样的线程会使系统陷入困境吗?

4

2 回答 2

5

在底层,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
于 2014-05-08T21:23:01.777 回答
0

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

于 2012-01-06T19:54:59.493 回答