Использует ли поток Android Looper вычислительную мощность?

Этот вопрос, вероятно, также применим к общему миру потоков Java...

У меня есть поток, который я использую так (это в методе run):

Looper.prepare();

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

Looper.loop();

Мой вопрос заключается в том, использует ли поток ЦП, пока он ждет, пока что-то будет передано обработчику? Или он действительно "спит"?

Может ли пара таких потоков тормозить систему?


person yydl    schedule 06.01.2012    source источник


Ответы (2)


Под капотом Looper — это фасад на уровне Java для объекта Looper собственного кода (написанного на C++). Нативный зацикливатель кода использует системный вызов Linux «epoll», который представляет собой механизм уведомления о событиях ввода-вывода, созданный для масштабируемости (т.е. вы можете иметь множество их с небольшим влиянием на производительность — хотя некоторое влияние на память). Это означает, что когда 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
person ZachM    schedule 08.05.2014

Когда поток ожидает сообщения, он не готов к запуску. Поток, который не готов к запуску, не может использовать ЦП.

person David Schwartz    schedule 06.01.2012