# 事件派遣线程

> 原文： [https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html)

Swing 事件处理代码在称为事件派发线程的特殊线程上运行。大多数调用 Swing 方法的代码也在这个线程上运行。这是必要的，因为大多数 Swing 对象方法都不是“线程安全的”：从多个线程调用它们会导致[线程干扰](../../essential/concurrency/interfere.html)或[内存一致性错误](../../essential/concurrency/memconsist.html)。一些 Swing 组件方法在 API 规范中标记为“线程安全”;这些可以从任何线程安全地调用。必须从事件派发线程调用所有其他 Swing 组件方法。忽略此规则的程序可能在大多数情况下正常运行，但会遇到难以重现的不可预测的错误。

将事件调度线程上运行的代码视为一系列简短任务是有用的。大多数任务都是事件处理方法的调用，例如`ActionListener.actionPerformed`。其他任务可以通过应用程序代码使用`invokeLater`或`invokeAndWait`进行调度。事件派发线程上的任务必须快速完成;如果他们不这样做，未处理的事件将备份，用户界面将无法响应。

如果需要确定代码是否在事件派发线程上运行，请调用 [`javax.swing.SwingUtilities.isEventDispatchThread`](https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingUtilities.html#isEventDispatchThread--) 。