这是我不明白的设计决定。
Android 和 JME 都遵循启动应用程序的线程是 UI 线程的策略,并且您注意将消耗资源的东西卸载到另一个线程。
另一方面,在 Swing 中,您EventQueue.invokeLater(Runnable)
用于 UI 和SwingWorker
后台处理。
现在,主线程是做什么用的?
正如这篇关于线程的 Sun 文章中所提到的,您可以在主线程中做任何您想做的事情,包括构建 GUI,即使这样做是有风险的。
回到问题:
Swing 尚未使用仅与 GUI 相关的主线程实现,因为这将强制采用纯多线程方法,并且:
组件开发人员不必对线程编程有深入的了解:所有组件都必须完全支持多线程访问的工具包可能难以扩展,特别是对于不擅长线程编程的开发人员而言。
事件以可预测的顺序分派:排队的可运行对象invokeLater()
与鼠标和键盘事件、计时器事件和绘制请求从相同的事件队列分派。
在组件支持多线程访问的工具包中,组件更改与线程调度程序一时兴起的事件处理交错。这使得全面测试变得困难或不可能。
更少的开销:试图仔细锁定关键部分的工具包可能会花费大量时间和空间来管理锁。
每当工具包调用可能在客户端代码中实现的方法(例如,公共类中的任何公共或受保护方法)时,工具包必须保存其状态并释放所有锁,以便客户端代码可以在必要时获取锁。
当控制从方法返回时,工具包必须重新获取它的锁并恢复它的状态。所有应用程序都承担此费用,即使大多数应用程序不需要同时访问 GUI。
因此主线程可用于初始化(数据和 GUI,只要它们不花费太多时间),而大多数初始化后的 GUI 步骤自然发生在事件调度线程中。
一旦 GUI 可见,大多数程序都是由事件驱动的,例如按钮操作或鼠标点击,这些事件总是在事件调度线程中处理。
启动器java
不是 Swing(或 AWT)特定的。main
是一个通用的入口点。AWT 调用后会按需启动 Event Dispatch Thread main
,所以不能使用主线程。它甚至可以退出 EDT 并开始一个新的。
奇怪的是,在 AWT EDT 上不调用 applet 生命周期方法。
主线程只是为执行main
方法而创建的线程。