Skip to content

java.awt.EventQueue - AWT 事件队列

java.awt.EventQueue 是 AWT (Abstract Window Toolkit) 的事件调度机制,用于管理事件的队列和分发。

所有的 GUI 事件(如鼠标点击、键盘输入、窗口操作等)都会被放入事件队列中,并由 AWT 的事件分发线程 (EDT) 顺序地分发给相应的事件处理程序。

主要功能:

  • 确保线程安全地调度事件。
  • 支持自定义事件的发布。
  • 提供延迟任务的执行能力。

每个 AWT 应用程序在启动时都会自动创建一个 EventQueue 实例,并将其与 AWT 的事件分发线程(EDT, Event Dispatch Thread)关联。所有的事件(例如用户输入或窗口状态改变)都会进入这个队列,并且从队列中取出交给处理函数。

方法

事件管理

方法名称描述
void postEvent(AWTEvent event)将指定的事件放入事件队列中。
AWTEvent getNextEvent()从队列中取出下一个事件,如果队列为空则阻塞等待。
boolean peekEvent()检查队列中是否有事件,但不移除它们。
AWTEvent peekEvent(int id)检查队列中是否存在指定事件 ID 的事件,但不移除它们。

事件调度

方法名称描述
static void invokeLater(Runnable r)将指定的任务放入事件队列,并在未来某个时间点由事件分发线程执行。
static void invokeAndWait(Runnable r)将指定的任务放入事件队列并等待任务完成,适用于需要立即执行的场景(线程安全)。

异常处理

方法名称描述
static void setDefaultExceptionHandler(Consumer<Throwable> handler)设置默认的未捕获异常处理器,用于处理事件队列中的未处理异常。
static Consumer<Throwable> getDefaultExceptionHandler()获取当前的默认未捕获异常处理器。

事件队列控制

方法名称描述
static boolean isDispatchThread()检查当前线程是否是事件分发线程 (EDT)。

常见用法

调度任务

使用 invokeLaterinvokeAndWait 可以调度任务到事件分发线程:

java
// 将任务放入事件队列,由事件分发线程异步执行
EventQueue.invokeLater(() -> System.out.println("Task executed later"));

// 将任务放入事件队列,并等待任务完成
EventQueue.invokeAndWait(() -> System.out.println("Task executed and waited"));

自定义事件处理

通过 postEvent 向队列中添加自定义事件:

java
AWTEvent myEvent = new AWTEvent(new Object(), 1001) {}; // 自定义事件
EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
eventQueue.postEvent(myEvent);

处理异常

设置默认异常处理器:

java
EventQueue.setDefaultExceptionHandler(e -> {
    System.err.println("Unhandled exception in EDT: " + e.getMessage());
});

EventQueue 是 Java GUI 程序的核心工具之一,确保了事件在单一线程中有序处理,从而简化了多线程开发的复杂性。