Re: [問題] finalize一定會被執行到嗎?

看板java作者 (小安)時間16年前 (2009/04/14 21:49), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《neverfly (neverfly)》之銘言: : 我寫了一個Thread, : 功能就是每隔五秒監視資料庫的異動, : 假設資料庫被新增了一筆資料,就去做某些事。 : 所以這個Thread基本上是隨著系統起動而被起動, : 等到系統整個被停掉它才會被停掉。 : 但是我希望它在Exception發生,導致它會掛掉的時候, : 或是說系統被停掉,導致它也連帶被停止的時候, : 能把connection給close掉,以免佔了資料庫的連線數。 : 雖說不去管它,過一陣時間這個連線也會被資料庫踢掉, : 但某些因素,我希望它能很快的釋放資源。 : 所以請問我如果把con.close();con=null;這段語法, : 放在finalize的話,它無論如何一定會被執行到嗎? 不知道你說的 finalize 是物件的 finalize() 方法, 還是例外處理的 finally block? 如果是前者,在 GC 準備回收物件前就會執行 finalize() 方法, 但是若程式執行 System.exit() 了, 我記得 JVM 不會先把記憶體清空才收工, 也就是說,這樣 finalize() 就不會被執行了。 其他的情況像是遇到 Runtime Exception 或 Error 我就不清楚了。 而後者,例外處理的 finally block, 據書上說只有兩個例外不會進入, 第一同樣也是 System.exit(), 第二是在 try 或是 catch 中又出現其他 uncaught exception, 不過第二項據我實際測試結果(5.0),還是會進入 finally block。 註: 以上說的例外不包含電腦關機,或是其他中斷、破壞電腦的行為 XD 不管你說的 finalize 指的是何者, 我想你的情況只要將 con.close() 寫在 finally block 就可以了。 : 由於不太熟Thread,想另外再請問一下, : 像這種寫成背景程序的thread, : 我是寫成像這種形式 : void run(){ : while(true){ : do something : sleep(5000); : } : } : 每次迴圈停頓五秒,以免佔住太多的cpu資源, : 請問除此之外還有比較不佔資源的寫法嗎? 我自己目前也會用這樣的方法, 有沒有更好的方法就請其他網友指教囉 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.16.196

04/14 21:52, , 1F
謝謝你的回答,我指的是用來當destructor的這個方法
04/14 21:52, 1F
文章代碼(AID): #19v9H-mN (java)
文章代碼(AID): #19v9H-mN (java)