2012-03-26 86 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