Использует ли поток Android Looper вычислительную мощность? - PullRequest
1 голос
/ 06 января 2012

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

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

Looper.prepare();

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

Looper.loop();

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

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

Ответы [ 2 ]

5 голосов
/ 09 мая 2014

Под капотом Looper находится фасад на уровне Java для нативного кода объекта Looper (написанного на C ++).Нативная петля кода использует преимущества системного вызова Linux «epoll», который представляет собой механизм уведомления о событиях ввода / вывода, созданный для масштабируемости (т. Е. Их может быть множество с небольшим влиянием на производительность - хотя некоторое влияние на память).Это означает, что когда 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 голосов
/ 06 января 2012

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

...