假設我有一個對象「A」,它在構造函數中啓動某個進程。一旦對象被釋放,我需要調用一個清理方法(設置爲null或超出其生命範圍)。Java,如何在對象上銷燬進程
問題是java沒有析構函數,並且在對象設置爲null或超出範圍後,並不保證所謂的「finalize」方法正確運行。只有當GC認爲「時間到了」。
另外我不能使用shutdown hook,因爲我的代碼在Java EE服務器上運行,並不是一個簡單的Java SE應用程序,它將一次運行並終止。在這種情況下可以做些什麼?
假設我有一個對象「A」,它在構造函數中啓動某個進程。一旦對象被釋放,我需要調用一個清理方法(設置爲null或超出其生命範圍)。Java,如何在對象上銷燬進程
問題是java沒有析構函數,並且在對象設置爲null或超出範圍後,並不保證所謂的「finalize」方法正確運行。只有當GC認爲「時間到了」。
另外我不能使用shutdown hook,因爲我的代碼在Java EE服務器上運行,並不是一個簡單的Java SE應用程序,它將一次運行並終止。在這種情況下可以做些什麼?
您不應該在Java EE容器中創建自己的線程,也不要試圖殺死它們,因爲這已被棄用,並且會破壞您的虛擬機/ Java EE容器。
看看在CommonJ JSR 237,它允許在Java EE容器中創建背景工人:http://docs.oracle.com/cd/E13222_01/wls/docs92/commonj/commonj.html
您可以控制使用的ServletContextListener Java EE應用程序的啓動和關閉:http://www.roseindia.net/servlets/ServletContextListener-example.shtml。
它只是不可能使用Java。
只要GC想要刪除對象,但在程序終止時(不應該在Java EE應用程序中發生),就會調用finalize。
所以唯一的辦法就是自己做。例如,您可以使用ObjectPool,其中對象A的所有實例都存儲在一個列表中(如果需要,還會附加一個時間戳)。當時間到來時(例如通過使用wget & cron的特殊URL觸發),您只需遍歷此列表並銷燬不再需要的每個對象。
這只是一種(非常簡單)的可能方式。
如果您舉例說明您正在努力實現的目標,那麼我們可能會幫助您爲您的問題提出解決方案或不同方法。 – Marthin 2012-03-28 11:03:38