作者tkcn (小安)
看板java
标题Re: [问题] finalize一定会被执行到吗?
时间Tue Apr 14 21:49:49 2009
※ 引述《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
1F:推 neverfly:谢谢你的回答,我指的是用来当destructor的这个方法 04/14 21:52