Java: PhantomReference, ReferenceQueue и завершить

У меня есть PR, объект O, на который указывает PR, и RQ, настроенный для PR. У меня есть поток, который продолжает опрашивать RQ, и при первой ссылке, которую он находит в RQ, поток печатает время, в которое он его нашел, и завершает работу.

Все работает хорошо, но в момент завершения O (независимо от того, насколько это тривиально) поток больше не находит ссылку в RQ и продолжает работать бесконечно.

Вопрос: почему так происходит? Я'м с использованием Sun JDK 1.6.

Вот's код:

good case

public class MyGCPhantom 
{   
    public static void main(String[] args) throws InterruptedException 
    {       
        GCPhantomObject p = new GCPhantomObject();
        ReferenceQueue phantomQueue = new ReferenceQueue();
        PhantomReference pr = new PhantomReference(p, phantomQueue);      
        new GCPhantomThread(phantomQueue, "Phantom").start();
        p = null;

        System.gc();
    }
}

class GCPhantomObject
{   
    @Override
    protected void finalize()
    {
        //System.out.println("GCPhantom finalized " + System.currentTimeMillis());      
    }
}

class GCPhantomThread extends Thread
{
    private ReferenceQueue referenceQueue;
    private String name;

    GCPhantomThread(ReferenceQueue referenceQueue, String name)
    {
        this.referenceQueue = referenceQueue;
        this.name = name;
    }

    @Override
    public void run()
    {
        while(referenceQueue.poll() == null);       
        System.out.println(name + " found at " + System.currentTimeMillis());
    }
}

bad case

Просто раскомментируйте СОП вfinalize() изGCPhantomObject

Ответы на вопрос(4)

Ваш ответ на вопрос