面试的时候有被问道这个问题,百度了一下好像回答都是复制粘贴的模糊回答
想要一个标准一点的回答
为什么这个死循环不会阻塞线程呢?
您的每一个用心回答,都会让这个世界变得更美好一些!
你有尝试去阅读Handler的源码吗?
关键点就两个。
一个是没有消息的时候,会释放资源,不再轮询。
另外一个是把消息发到队列里的时候,会唤醒轮询。
这样子,就不阻塞了呀。
判断是否需要唤醒
boolean enqueueMessage(Message msg, long when) { ... if (needWake) { nativeWake(mPtr); } return true; }
唤醒:nativeWake(mPtr);
轮询获取消息的地方
public static void loop() { ... for (;;) { Message msg = queue.next(); // might block ... } }
再看看队列里的next方法
这个方法可能会被阻塞
Message next() { ... for (;;) { nativePollOnce(mPtr, nextPollTimeoutMillis); ... }
到这里,你可以理解为主线程去干其他事情了,当消息进入队列的时候,前面不是有个唤醒嘛。这样子主线程在某个时间片又来轮询了。
你有尝试去阅读Handler的源码吗?
关键点就两个。
一个是没有消息的时候,会释放资源,不再轮询。
另外一个是把消息发到队列里的时候,会唤醒轮询。
这样子,就不阻塞了呀。
判断是否需要唤醒
唤醒:nativeWake(mPtr);
轮询获取消息的地方
再看看队列里的next方法
这个方法可能会被阻塞
到这里,你可以理解为主线程去干其他事情了,当消息进入队列的时候,前面不是有个唤醒嘛。这样子主线程在某个时间片又来轮询了。