zoukankan      html  css  js  c++  java
  • Android开发为什么主线程可以一直运行而不会退出来

    Android开发为什么主线程可以一直运行而不会退出来

    1. App启动后系统通过反射实例化ActivityThread类,并调用main方法,主线程入口:

      main方法里调用了我们熟悉的Looper的prepare方法,然后调用loop方法进入死循环状态,所以主线程不会退出,退出就异常了。。。

      public static void main(String[] args) {
          //...
          Looper.prepareMainLooper();//调用主线程的Loop的prepare方法
      	//...
          Looper.loop();	//进入循环loop状态
          throw new RuntimeException("Main thread loop unexpectedly exited");
      }
      
    2. 为什么主线程进入死循环loop状态,主线程没有卡顿?

      由于主线程启动后,就会进入死循环状态,所以所有和主线程打交道的必须通过主线程的handler,而主线程进入死循环了为什么没有卡住呢?这个问题就涉及到MessageQueue的消息队列的存取问题了,以及native epoll机制。消息队列为空时,主线程会进入等等状态(nativePollOnce),当有新消息入队列时,epoll机制会通过nativeWake方法唤醒主线程,所以主线程不会主卡也不会一直耗时,因为没消息处理了就会进入等待休眠状态,这就是epoll机制的好处。

      //MessageQueue的两个方法
      Message next() {
          nativePollOnce(ptr, nextPollTimeoutMillis);
      }
      boolean enqueueMessage(Message msg, long when) {
      	nativeWake(mPtr);
      }
      
  • 相关阅读:
    poj 3278 catch that cow
    POJ 1028 Web Navigation
    poj 2643 election
    hdu 1908 double queues
    hdu_2669 Romantic(扩展欧几里得)
    0/1背包 dp学习~6
    校验码
    最长上升子序列(LIS经典变型) dp学习~5
    LCS最长公共子序列~dp学习~4
    最长上升子序列(LIS) dp学习~3
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/15010203.html
Copyright © 2011-2022 走看看