主应用程序线程会发生什么?

时间:2017-08-03 16:45:57

标签: java multithreading swing

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

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

通常,main方法只是调用SwingUtilities#invokeLater(Runnable)来初始化一个窗口等等,因此GUI初始化是在EDT上完成的... BTW,据我所知(再次) ,触及GUI的一切都必须在EDT上执行......

问题:用于/可用的主线程是什么?在致电invokeLater()后它会不会消失?它消耗资源吗?我可以(并且这是一个很好的做法)使用它来执行...我不知道......网络的东西?

2 个答案:

答案 0 :(得分:2)

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

  1. 初始个线程(执行初始应用程序代码的线程, 我们的主要在这里)
  2. EDT (正如您所说)
  3. 工作人员主题(处理后台任务)
  4. 初始线程创建Runnable以运行swings任务并在EDT中安排它。之后,该程序主要由GUI驱动,应用程序代码仍然存在并且可以继续执行其他任务(网络工作人员,因为您注意到)并消耗资源尽可能多因为它需要。 任何Swing组件方法都必须由EDT(但其中一些)进行调用,因为它们的swing方法不是" 线程安全的"。所以,  SwingUtilities#invokeLater(Runnable)  只需将 EDT 任务列表中的runnable排队,然后等待轮到它运行。

    doc here非常有帮助。

答案 1 :(得分:2)

当控件到达main()的末尾时,Java程序中的主线程就会死掉。

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

Java中的每个线程都是守护程序线程或非守护程序线程。后者是新Thread的默认情况。如果你想要一个守护进程,你必须调用t.setDaemon(true)

只要至少有一个非守护程序线程仍然存在,JVM就会继续运行。

  

使用/可用的主要线程是什么?

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