Java 如何停止摇摆EDT

Java 如何停止摇摆EDT,java,swing,event-dispatch-thread,Java,Swing,Event Dispatch Thread,典型的Swing应用程序在开始时启动EDT,当最后一个窗口关闭时,应用程序基本上停止,并使用System.exit隐式或显式退出 但我的小应用程序实际上是一个对Swing一无所知的框架插件。我的插件在被调用时会显示一个对话框,以便从用户那里获得一些输入,然后退出,但框架将/必须继续运行。因此我无法调用系统。退出 但如果我不这样做,EDT将继续运行,并且一旦框架完成,EDT仍将不断运行 所以我想在不关闭应用程序的情况下关闭EDT。如何做到这一点?Oracle/Sun提供的以下文档对此问题提供了一些

典型的Swing应用程序在开始时启动EDT,当最后一个窗口关闭时,应用程序基本上停止,并使用System.exit隐式或显式退出

但我的小应用程序实际上是一个对Swing一无所知的框架插件。我的插件在被调用时会显示一个对话框,以便从用户那里获得一些输入,然后退出,但框架将/必须继续运行。因此我无法调用
系统。退出

但如果我不这样做,EDT将继续运行,并且一旦框架完成,EDT仍将不断运行


所以我想在不关闭应用程序的情况下关闭EDT。如何做到这一点?

Oracle/Sun提供的以下文档对此问题提供了一些说明:

[……]

在1.4之前,辅助线程从未终止

从1.4开始,由于对4030718进行了修复,行为发生了更改。在当前实现中,AWT终止其所有助手线程,允许应用程序在满足以下三个条件时干净地退出:

  • 没有可显示的AWT或Swing组件
  • 本机事件队列中没有本机事件
  • java事件队列中没有AWT事件
因此,希望在不调用System.exit的情况下干净退出的独立AWT应用程序必须:

  • 确保应用程序完成后,所有AWT或Swing组件都不可显示。这可以通过在所有顶级窗口上调用Window.dispose来完成。请参阅Frame.getFrames
  • 确保应用程序使用任何AWT或Swing组件注册的AWT事件侦听器的任何方法都不能运行到无限循环中或无限期挂起。例如,由某个AWT事件触发的AWT侦听器方法可以将相同类型的新AWT事件发布到EventQueue。其理由是AWT事件侦听器的方法通常在助手线程上执行
[……]


可能有一些隐藏窗口(例如,使用已关闭的
JOptionPane.showMessageDialog(…)
显示的对话框)阻止Swing退出。您可以使用

Stream.of(Window.getWindows()).forEach(System.out::println);
如果您不再需要它们,您可以很容易地将其清除:

Stream.of(Window.getWindows()).forEach(Window::dispose);

然后,事件调度线程应该停止。

出现一些问题,IIRC。您需要确保处置所有资源。