Я пытаюсь понять работу PhantomReferences в Java и написал эту программу для этого.Java PhantomReference не получает enqued
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 docs. Я что-то упустил?
1. Вы должны были разместить здесь код. 2. Код для меня не имеет большого смысла. У вас есть пустой цикл, затем Thread.sleep, затем ссылка на null-out, затем GC и сразу завершите работу. У другой нити не будет времени для уведомления. –
Поскольку refQueue.remove() является блокирующим вызовом, программа никогда не выйдет до пояса. – user1109536
Это хороший момент; попробуйте просто добавить * два * 'System.gc()' звонки, посмотреть, что произойдет. –