Java: PhantomReference, ReferenceQueue e finalizar

Eu tenho um PR, um objeto O para o qual o PR aponta e um RQ configurado para PR. Eu tenho um thread que continua a sondar o RQ e, na primeira referência que encontra no RQ, o thread imprime a hora em que o encontrou e sai.

As coisas funcionam bem, mas no momento em que O tem uma finalização (não importa o quão trivial), o thread não encontra mais uma referência no RQ e continua rodando indefinidamente.

Pergunta: por que isso acontece dessa maneira? Estou usando o Sun JDK 1.6.

Aqui está o 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

Apenas descomente o SOP emfinalize() doGCPhantomObject.

questionAnswers(4)

yourAnswerToTheQuestion