2014-10-02 3 views
0

Я пытаюсь понять работу 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. Я что-то упустил?

+0

1. Вы должны были разместить здесь код. 2. Код для меня не имеет большого смысла. У вас есть пустой цикл, затем Thread.sleep, затем ссылка на null-out, затем GC и сразу завершите работу. У другой нити не будет времени для уведомления. –

+1

Поскольку refQueue.remove() является блокирующим вызовом, программа никогда не выйдет до пояса. – user1109536

+0

Это хороший момент; попробуйте просто добавить * два * 'System.gc()' звонки, посмотреть, что произойдет. –

ответ

1

Это дубликат ... но я не могу найти оригинал.

Вкратце: оно будет быть в очереди ... в один прекрасный день. Не сразу. Возможно, после следующей сессии GC, возможно, на следующей неделе. Нет гарантии относительно времени.

+0

+1 И если все остальные потоки мертвы, тогда это никогда не произойдет, если это не сразу. –

Смежные вопросы