例如,事件侦听器如何不断轮询以检查按钮是否被单击?

How do event listeners constantly poll to check to see if a button, for example, was clicked?

例如,Java 中的按钮实际上如何侦听事件的发生?我知道按钮事件一旦在特殊的 EDT(事件调度线程) 中被单击就会被处理。但是如果没有 "busy waiting" 按钮如何知道它已经被实际点击了。如果在对用户隐藏的单独线程中(例如 Event Dispatching Thread),我理解的唯一方法是可能每隔一段时间进行一次持续轮询,也许每隔几毫秒检查一次如果它被点击。最重要的是,单击按钮如何调用代码?

我假设人们会建议它是观察者模式在这里工作,但从我看到的例子来看,用户或多或少明确地通知了观察者所以它是与仅调用常规方法几乎没有什么不同。

s.setName("IceCream");
public void setName(String name) {
    this.name = name;
    setChanged();
    notifyObservers();
}

然后调用 update() 方法。这不是从头开始的观察者模式,而是使用 Observable 和 Observer 类.

如果有任何需要澄清的地方,请告诉我

这个问题有点类似于我上一个关于如何在不忙等待的情况下不断轮询条件的问题。

How does, for example, a button in Java actually listen for an event to occur?

该按钮没有任何作用。该按钮仅提供一个 处理程序 (即 java.awt.event.ActionListener),当事件调度线程 (EDT) 确定给定的鼠标单击是针对该按钮时将调用该处理程序。

等待鼠标和键盘事件的是EDT。它如何等待将取决于它是什么操作系统运行。一些操作系统提供了一个单一的系统调用,让一个进程等待来自几个不同来源中的任何一个的输入。在 Windows 下是 WaitForMultipleObjects(...)。在 Linux 下,它是 select(...)poll(...)

假设某个操作系统提供本机线程,但没有 select() 类函数,JVM 可以为每个不同的输入源创建一个线程(例如,键盘线程、鼠标线程、. ..) 这些都可以将事件推送到 EDT 将使用的队列中。


I assume people are going to suggest it is the Observer Pattern at work here,

基本上是的,但是由于 Java 几乎与命名模式的想法一样古老,您可能在源代码中找不到 "observer" 这个词。