我试图了解Java中PhantomReferences的工作原理并为此编写了这个程序。
public static void main(String[] args) throws InterruptedException {
final ReferenceQueue refQueue = new ReferenceQueue();
Employer emp = new Employer();
emp.setName("John");
PhantomReference<Employer> phantom = new PhantomReference<Employer>(emp, refQueue);
List referenceList = new ArrayList();
referenceList.add(phantom);
Thread th = new Thread(new Runnable(){
@Override
public void run() {
try {
PhantomReference ref = (PhantomReference) refQueue.remove();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
th.start();
for (int i = 0; i < 50000000; i++) {
if(i==(50000000-1)){
Thread.sleep(10000);
System.out.println(i);
System.out.println("setting emp to null ");
emp=null;
System.gc();
}
}
}
但是在这里我没有看到引用如java API文档中提到的那样。 我在这里错过了什么吗?
答案 0 :(得分:1)
这是重复的...但我找不到原文。
简而言之:将排队......一天或另一天。不是马上。也许在下一次GC运行之后,可能是下周。时间无法保证。