Java: PhantomReference, ReferenceQueue y finalize

Tengo un PR, un objeto O al que apunta el PR y un RQ configurado para PR. Tengo un hilo que sigue sondeando el RQ, y en la primera referencia que encuentra en RQ, el hilo imprime el momento en que lo encontró y sale.

Las cosas funcionan bien, pero en el momento en que O tiene una finalización (no importa cuán trivial), el hilo ya no encuentra una referencia en RQ y se sigue ejecutando indefinidamente

Pregunta: ¿Por qué sucede de esta manera? Estoy usando Sun JDK 1.6.

Aquí está el código:

good case

public class MyGCPhantom 
{   
    public static void main(String[] args) throws InterruptedException 
    {       
        GCPhantomObject p = new GCPhantomObject();
        ReferenceQueue phantomQueue = new ReferenceQueue();
        PhantomReference<GCPhantomObject> pr = new PhantomReference<GCPhantomObject>(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

Sólo descomentar el SOP enfinalize() deGCPhantomObject.

Respuestas a la pregunta(4)

Su respuesta a la pregunta