一个HOOK类,表明当前类结束后,会调用方法。
package hadoop.util;
import java.util.ArrayList;
import java.util.List;
public class Hook {
static Hook hook = new Hook();
static List list = new ArrayList();
static{
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
for(int i = 0;i<list.size();i++){
System.out.println("Hook:"+((Instance)list.get(i)).getI());
}
}
});
}
}
一个Instance测试类,
package hadoop.util;
public class Instance {
int i;
public Instance(int i) {
this.i = i;
Hook.list.add(this);//如果不加这句话,由于gc能输出finalize... 加上这句话,则无法输出finalize...
}
public int getI(){
return i;
}
@Override
protected void finalize() throws Throwable {
System.out.println("finalize"+i);
super.finalize();
}
public static void main(String[] args) {
Instance instanceA = new Instance(1);
Instance instanceB = new Instance(2);
instanceA = null;//内存不会消失
instanceB = null;
System.gc();
try {
Thread.sleep(1000);//不加sleep,则"finalize..."输出可能比"~"慢
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("~");
}
}