2012-03-26 82 views
1

我们编写了一个java代理,其中包括使用java.awt.TrayIcon提供的某种GUI。当我们在例如Tomcat的,我们有以下的问题:javaagent,系统托盘和关机

  1. 用户使用shell脚本
  2. 我们的代理将启动Tomcat的图标,系统托盘
  3. 用户关闭Tomcat的下使用shell脚本
  4. AWT事件线程看到,有仍显示组件,系统托盘图标,不退出
  5. 作为AWT事件线程非守护线程,整个应用程序不能退出

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

回答

1

为了完整起见,这里是我如何解决了这个问题:

我已经开始另一个守护线程与工作,定期检查可显示的AWT组件。如果只剩下其中的一个,那是我的系统托盘图标,那么我将其删除。这允许AWT子系统退出,导致整个应用程序正常退出。

0

你可以尝试添加一个关闭挂钩(Runtime.getRuntime().addShutdownHook())这就要求

SystemTray.getSystemTray().remove(trayIcon);

+0

不幸的是,关机挂钩永远不会被调用,因为JVM实际上并没有关闭。精确地说,AWT事件线程“强制”它继续运行。 – Nikem 2012-03-26 14:52:09

+0

你在什么操作系统上?在* ix上,SIGTERM会触发关闭挂钩,而SIGKILL会强制终止JVM,尽管有任何非守护进程正在运行线程。 – 2012-03-26 15:23:52

+0

是的,但我不是在强求杀死或终止JVM。问题是如何让JVM自然退出,当main方法退出时。因为没有调用shutdown钩子,所以当main方法退出但仍有非守护线程仍在运行时。 – Nikem 2012-03-26 15:31:36