1

我们编写了一个 java 代理,其中包括使用 java.awt.TrayIcon 提供某种 GUI。当我们在例如Tomcat中使用这个代理时,我们会遇到以下问题:

  1. 用户使用 shell 脚本启动 Tomcat
  2. 我们的代理将图标添加到系统托盘
  3. 用户使用 shell 脚本关闭 Tomcat
  4. AWT 事件线程看到,仍然有可显示的组件、系统托盘图标,并且没有退出
  5. 由于 AWT 事件线程是非守护线程,整个应用程序无法退出

现在的问题是,我们应该怎么做才能让应用程序关闭?是否可以制作 AWT 事件调度线程守护进程?代理是否有关闭挂钩?还要别的吗?

4

2 回答 2

1

为了完整起见,以下是我解决此问题的方法:

我已经为该作业启动了另一个守护线程,它会定期检查可显示的 AWT 组件。如果只剩下一个,那就是我的系统托盘图标,那么我将其删除。这允许 AWT 子系统退出,从而导致整个应用程序正常退出。

于 2012-12-19T06:54:31.970 回答
0

您可以尝试添加一个关闭挂钩 ( Runtime.getRuntime().addShutdownHook()) 来调用

SystemTray.getSystemTray( ).remove( trayIcon );

于 2012-03-26T14:30:42.440 回答