【问题标题】:What happens to the main application thread?主应用程序线程会发生什么?
【发布时间】:2017-08-03 16:45:57
【问题描述】:

据我所知,Swing GUI 应用程序中有 3 个线程:

  • 主应用线程,它执行main() 方法
  • 工具包线程,接收系统事件
  • 事件调度线程,专门用于 GUI 内容的绘制和事件处理

通常,main 方法只是调用SwingUtilities#invokeLater(Runnable) 以初始化窗口等,因此在 EDT 上进行 GUI 初始化......顺便说一句,据我所知(再次),一切触及 GUI 的必须在 EDT 上执行...

问题:主线程用于/可用于什么?它在调用invokeLater() 后就死了吗?它会消耗资源吗?我可以(并且它是一个好习惯)使用它来执行...我不知道...网络的东西?

【问题讨论】:

  • 我相信如果没有什么能阻止它返回,主线程就会死掉,然后只有 EDT 线程存活。如果您主要有其他事情要做,那就在那儿做,但不要过多考虑可以放在那里的东西。如果您的 GUI 上有任何用户操作需要不直接显示长任务,只需从那里创建一个新线程。

标签: java multithreading swing


【解决方案1】:

Swing 程序员实际上处理 3 种 线程:

  1. Initial 线程(执行初始应用程序代码的线程, 我们主要在这里)
  2. EDT(如您所说)
  3. Worker 线程(处理后台任务)

初始线程创建 Runnable 来运行 swings 任务并将其安排在 EDT 中。之后,程序主要由 GUI 驱动,应用程序代码仍然存在,可以继续执行其他任务(您注意到的网络人员)并消耗尽可能多的资源根据需要。 任何 Swing 组件方法都必须由 EDT(但其中一些)调用,因为它们的 Swing 方法不是“线程安全”。所以, SwingUtilities#invokeLater(Runnable) 只需将 runnable 在 EDT 任务列表中排队并等待轮到它运行。

doc here 很有帮助。

【讨论】:

    【解决方案2】:

    当控制到达main() 的末尾时,Java 程序中的主线程终止。

    在您描述的程序架构中,主线程已经创建了 EDT,可能还有其他线程,而这些其他线程使 JVM 保持活动状态。

    Java 中的每个线程要么是 daemon 线程,要么是非守护线程。后者是新Thread 的默认情况。如果你想要一个守护进程,你必须打电话给t.setDaemon(true)

    只要至少有一个非守护线程还活着,JVM 就会继续运行。

    主线程用于/可用于什么?

    它可用于您将使用任何其他线程的任何目的。它执行你为它编写的任何代码。

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 2013-10-13
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多