我們編寫了一個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