Java Swingの興味深いバグ(読んだことがあります)を読んでいます。Java SystemTray.add(TrayIcon)は、終了時にSwing GUIをハングします
最初にまずSSCCEを作成します。 ここに行きます。
class GUI extends JFrame{
public static void main(String[] args){
// All GUI work should be handled in the EDT.
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new GUI().setVisible(true);
}
});
}
GUI(){
// Make a nice icon
ImageIcon img = new ImageIcon(this.getClass().getClassLoader().getResource("img/1.png"));
// Make a TrayIcon with the image
SystemTray sysTray = SystemTray.getSystemTray();
TrayIcon trayIcon = new TrayIcon(img.getImage());
try {
sysTray.add(trayIcon);
}
catch(AWTException e) {
e.printStackTrace();
System.out.println("System Tray unsupported!");
}
this.setTitle("Example GUI");
this.setIconImage(img.getImage());
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}
私がこれを実行してウィンドウを閉じると、私はそれを処分し、様々なスレッドを終了させることを期待します。これは、「TrayIconを作成する」try/catchブロックをコメントアウトする場合です。
sysTray.add()行は例外を作成しないようですが、AWT-EventQueueスレッドのwait()でコードがハングするため、コード内にそのスレッドが終了するのを停止します。
これはバグですか、迷っていますか?
乾杯。
おかげで非常に多く、私はDISPOSE_ON_CLOSEがGCのためにそれをフラグが立てられ、一方EXIT_ON_CLOSEは、メモリ内のいくつかのものを残したという理解でした。私は読んでみましょう。 – Hemmels
@Hemmels:JVMを終了すると、ホストシステムは割り当てられたメモリを回復できます。 GCはその時点で無関係になります。 – trashgod