Re: [問題] finalize一定會被執行到嗎?
※ 引述《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
04/14 21:52, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):