这是我不明白的设计决定。
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/