Looper的loop方法在ActivityThread的main方法中调用,并启动一个无限的< code>for循环,该循环遍历一个消息队列。当队列中没有更多的消息时,它调用< code>nativePollOnce方法,等待下一条消息。< br >所以我的问题是< br> 1 .如果它等待下一条消息,那么主线程将被阻塞,那么它如何将更多的消息队列加入队列。< br> 2 .如果它没有被阻塞,那么它将消耗CPU周期,其他人将没有机会在队列中添加消息。< br >请考虑MessageQueue、Handler、Looper在主线程上,UI事件和输入事件由主线程处理。< br >链接< br >为什么主线程的Looper.loop()不阻塞UI线程?< does Looper.loop()为什么不阻塞UI线程< br > Android-Android中消息队列原生轮询一次是什么?< br > Android Looper线程使用处理能力吗?
这篇文章对这个话题描述的相当清楚,或者可以看到这个回答。
总结:
Looper 是一个非常基本的包装类,它将 MessageQueue 附加到线程并管理此队列。MessageQueue 是一种按顺序处理线程的同时处理请求的结构。在Android中,像Handler这样的消息/请求处理类使用Looper来管理它们各自的MessageQueue。
如果它等待下一条消息,那么主线程将被阻塞,那么它如何将更多的消息排入队列?
主线程只运行主循环。其他的都在主循环中运行。因此,如果这个循环正在等待新消息,那么主线程上根本没有其他代码在运行。这也意味着不可能有任何新消息从主线程本身排队。
如果它没有被阻止,那么它将消耗CPU周期,其他人将没有机会在队列中添加消息。请考虑MessageQueue、处理程序和循环器位于主线程上,并且UI事件和输入事件由主线程处理。
主线程阻塞,直到收到消息。此阻止机制是在本机层上实现的,因此针对性能进行了优化。
消息队列
和处理程序
只是不直接连接到任何线程的数据结构。
消息不需要由主线程自己排队。< code >处理程序的一个主要用例是向另一个线程发送消息。例如:
>
在主线程上创建一个处理程序
,以便将其绑定到主线程的循环器。
将其交给另一个线程,该线程可以发布消息以由主线程处理。
这是很常见的,每个活动
都会创建自己的处理程序,该处理程序
在Active.runOnUiThread()
中用于从后台线程发送UI任务。
我不明白为什么webclient会阻止我使用gradle的主要netty线程,以下是它的依赖项: 这个gradle脚本在两个应用程序中都使用。在第一个应用程序中,我执行: 第二个应用程序模拟长响应处理: 我希望呼叫服务不会阻塞主线程,而是会继续处理传入的连接,但直到我收到第一个呼叫的响应(睡眠将起作用),我的下一个连接将挂起等待。 结果:第一个应用程序像tomcat一样工作,只有一个线程 我的问题
线程实例的join()方法可用于将一个线程的执行开始“连接”到另一个线程的执行结束,这样一个线程在另一个线程结束之前不会开始运行。如果对线程实例调用join(),则当前运行的线程将阻塞,直到线程实例完成执行 但是如果我有多个线程并且当我在循环内部调用join时。所有线程并行运行。但是根据连接的概念,首先连接的线程应该完成,然后只有主线程才允许连接其他线程。 } 在上面的代码中,如果第一个线程被连接
问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码
我试图使用Java同步“原语”(synchronized,wait(),notify())实现类似于Java的有界BlockingQueue接口的东西,这时我偶然发现了一些我不理解的行为。 我创建了一个能够存储 1 个元素的队列,创建两个等待从队列中获取值的线程,启动它们,然后尝试将两个值放入主线程同步块中的队列中。大多数情况下它可以工作,但有时等待值的两个线程开始似乎相互唤醒并且不让主线程进入同
问题内容: 为什么Catch(Exception)一个坏主意? 问题答案: 因为当你捕获异常时,你应该正确处理它。而且,你不能期望在代码中处理所有类型的异常。同样,当你捕获所有异常时,你可能会得到一个无法处理的异常,并阻止堆栈中位于较高位置的代码正确处理它。 一般原则是捕获可能的最特定类型。
在下面的代码中,为什么主线程要等到子线程完成。 Driver.java ThreadRunner.java 调用“t.start()”后,在驱动程序类中,程序是否应该退出?我没有使用join,但主线程仍在等待,直到新旋转的“ThreadRunner”运行开始。这是因为在java中,主线程(由main方法启动)总是等待所有线程关闭吗?