回答这个问题的时候,我们回想下,Java线程中,如果给你一个线程,是不是执行完了Runnable里边的代码,线程就自动结束了。
好了,现在在回答这个问题,如果想要一个线程运行时间长,而且后边还可以让其进行处理事情,用Looper消息循环的方式来控制它最好,死循环也就是为了让这个线程保持生命,不然执行完一段代码就关闭回收了;再次使用线程就可以使用消息的方式发送一个中间带有执行代码的Runnable()消息给线程执行。
如果这个Android中的非UI线程如果没有事情做,应该是处于休眠状态,不会消耗太多资源。但是如果这个线程确实不用了,最好把looper消息循环停止掉,回收掉这个线程。
主线程的死循环一直运行是不是特别消耗CPU资源呢? 其实不然,这里就涉及到Linux pipe/epoll
机制,简单说就是在主线程的MessageQueue
没有消息时,便阻塞在loop的queue.next()
中的nativePollOnce()
方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。 Gityuan–Handler(Native层)