我们编写了一个java代理,其中包括使用java.awt.TrayIcon提供的某种GUI。当我们在例如Tomcat的,我们有以下的问题:javaagent,系统托盘和关机
- 用户使用shell脚本
- 我们的代理将启动Tomcat的图标,系统托盘
- 用户关闭Tomcat的下使用shell脚本
- AWT事件线程看到,有仍显示组件,系统托盘图标,不退出
- 作为AWT事件线程非守护线程,整个应用程序不能退出
现在的问题是,我们该怎么做才能让应用程序关闭?是否有可能使AWT Event调度线程守护进程?代理有关闭挂钩吗?还要别的吗?
不幸的是,关机挂钩永远不会被调用,因为JVM实际上并没有关闭。精确地说,AWT事件线程“强制”它继续运行。 – Nikem 2012-03-26 14:52:09
你在什么操作系统上?在* ix上,SIGTERM会触发关闭挂钩,而SIGKILL会强制终止JVM,尽管有任何非守护进程正在运行线程。 – 2012-03-26 15:23:52
是的,但我不是在强求杀死或终止JVM。问题是如何让JVM自然退出,当main方法退出时。因为没有调用shutdown钩子,所以当main方法退出但仍有非守护线程仍在运行时。 – Nikem 2012-03-26 15:31:36