我正在嘗試編寫一個Java單元測試,用於測試對終結器調用對象的影響。爲什麼在這個單元測試中不能調用finalize函數?
爲了確保終結器被調用,我使用了一個WeakReference方法,我在其他地方看到了stackoverflow。
我的問題是,在本次測試TestFinalizer的finalize方法不會被調用即使WeakReference的只是一個迭代後出現空:
public class FinalizerTest {
private static class TestFinalizer {
public static class Callback {
public int NumFinalize = 0;
public void finalized(){
NumFinalize++;
}
}
private Callback callback;
public TestFinalizer(Callback callback){
this.callback = callback;
}
@Override
public void finalize() throws Throwable {
callback.finalized();
super.finalize();
}
}
@Test
public void testForceFinalizer(){
TestFinalizer.Callback callback = new TestFinalizer.Callback();
TestFinalizer testFinalizer = new TestFinalizer(callback);
// Try to force finalizer to be called
WeakReference<Object> ref = new WeakReference<Object>(testFinalizer);
testFinalizer = null;
int maxTries = 10000, i=0;
while (ref.get() != null && i<maxTries) {
++i;
System.gc();
}
if (ref.get() != null)
fail("testFinalizer didn't get cleaned up within maxTries");
// Last line passes, next fails!
assertEquals("Should be exactly one call to finalizer", 1, callback.NumFinalize);
}
}
是的,Thread.sleep(3000);就在那裏爲我修好了。我想這是因爲儘管弱裁判已經被淘汰,但終結者線程還是要做到這一點...... – tdaffin 2012-03-03 00:16:05