2011-01-28 24 views
11

典型的Swing應用程序在開始時啓動EDT,當最後一個窗口關閉時,應用程序基本上以System.exit爲基礎停止,無論是隱式還是顯式。如何停止Swing EDT

但我的小應用程序實際上是一個框架的插件,它對Swing一無所知。我的插件將在調用時顯示一個對話框,以便從用戶那裏獲得一些輸入並在之後退出,但框架將會/必須繼續運行。所以我不能撥打System.exit

但是,如果我不這樣做了EDT將繼續運行,一旦框架完成EDT仍然可以運行,運行和運行...

所以我想殺死無EDT殺死應用程序。我怎麼做?

回答

11

Oracle提供的下列文件/陽光灑在這個問題上的一些光:AWT Threading Issues

[...]

1.4之前,輔助線程從未終止。

1.4開始,行爲已更改爲修復的結果爲4030718.當前實現,AWT終止其所有的助手線程允許應用程序完全退出時,以下三個條件:

  • 沒有可顯示的AWT或Swing組件。
  • 本地事件隊列中沒有本機事件。
  • java EventQueues中沒有AWT事件。

因此,希望完全退出,而不調用System.exit必須在一個獨立的AWT應用:

  • 確保所有AWT或Swing組件是由不可顯示的應用程序時結束。這可以通過在所有頂級Windows上調用Window.dispose來完成。請參閱Frame.getFrames。 ...
  • 確保應用程序使用任何AWT或Swing組件註冊的AWT事件偵聽器的方法都無法運行到無限循環或無限期地掛起。例如,由某個AWT事件觸發的AWT偵聽器方法可以向EventQueue發佈一個相同類型的新AWT事件。參數是AWT事件偵聽器的方法通常在輔助線程上執行。

[...]

+2

有一些問題,IIRC。您需要確保「處理**」所有**資源。 – 2011-01-29 02:14:05

0

可能有一些隱藏的窗口(例如,對話使用JOptionPane.showMessageDialog(…)其是已經關閉顯示)防止搖擺從離開。您可以檢查此使用

Stream.of(Window.getWindows()).forEach(System.out::println); 

如果你不需要他們了,你可以很容易被擺脫他們:然後

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

事件調度線程應該停止。