java - 为什么 EventDispatchThread 排在第一位?

标签 java swing edt

这是我不明白的设计决定。

Android 和 JME 都遵循启动应用程序的线程是 UI 线程的策略,您要注意将资源消耗的东西卸载到另一个线程。

另一方面,在 Swing 中,您将 EventQueue.invokeLater(Runnable) 用于 UI,将 SwingWorker 用于后台处理。

现在,主线程是做什么用的?

最佳答案

如本Sun article about thread所述,你可以在主线程中做任何你想做的事情,包括构建一个 GUI,即使它是有风险的。

  • Swing 方法不是线程安全的,但只要没有实现任何组件(Swing 或其他)(意味着组件的 paint() 方法已经或可能被调用),直到 2004 年都是可以的。<
  • 自 2004 年以来,正如本 SO question 中所提醒的那样, 它是 mandatory to create the GUI in the EDT .

回到问题:

Swing 还没有用仅与 GUI 相关的主线程实现,因为这会强制采用纯多线程方法,并且:

  • 组件开发人员不必深入了解线程编程:所有组件都必须完全支持多线程访问的工具包可能难以扩展,特别是对于那些不擅长线程编程。

  • 事件按可预测的顺序分派(dispatch):invokeLater() 入队的可运行对象与鼠标和键盘事件、计时器从同一个事件队列分派(dispatch)事件和绘画请求。
    在组件支持多线程访问的工具包中,组件更改与线程调度程序突发奇想的事件处理交织。这使得全面测试变得困难或不可能。

  • 更少开销:尝试小心锁定关键部分的工具包可能会花费大量时间和空间来管理锁。
    每当工具包调用可能在客户端代码中实现的方法(例如,公共(public)类中的任何公共(public)或 protected 方法)时,工具包都必须保存其状态并释放所有锁,以便客户端代码可以在必要时获取锁。< br/> 当控制权从该方法返回时,工具包必须重新获取其锁并恢复其状态。所有应用程序都承担此成本,即使大多数应用程序不需要并发访问 GUI。

因此主线程可用于初始化(数据和 GUI,前提是它们不会占用太多时间),而大多数 初始化后的 GUI 步骤自然发生在事件调度线程中。
一旦 GUI 可见,大多数程序都由按钮操作或鼠标单击等事件驱动,这些事件始终在事件调度线程中处理。

关于java - 为什么 EventDispatchThread 排在第一位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/572921/

相关文章:

java - 如何在 Eclipse Kepler 中添加 Web 工具平台 (WTP)

java - 在 JPanel 中对齐 JTextArea

java - TreeSet 表现得很奇怪

JAVA:如果没有大括号,关系继续

Java Generics - 难以执行强类型检查

java - 除非我插入打印语句,否则 while 循环不起作用 - java

java - 让 Swing 刷新 JLabel 时遇到问题(显然在事件调度线程上)

java - 从 Java 中的不同线程更新 GUI 的非马虎设计模式

java - 如何在 Jax rs 中运行 localhost url 进行发布

java - 如何将 IntBinaryOperator 与 Java Swing 的 Switch Case 语句一起使用? (简单计算器)