RFR 9: 8138696 : java.lang.ref.Cleaner - an easy to use > alternative to finalization (Roger Riggs)

Roger Riggs Roger.Riggs at Oracle.com
Fri Oct 2 20:16:56 UTC 2015


Hi Mike,

Thanks for the review and comments...

On 10/2/2015 3:33 PM, Mike Duigou wrote:
> Hi Roger;
>
> This looks like an interesting proposal and would be a good 
> replacement for alternative solutions.
>
> I am curious why the thread is run at max priority. Also, why not set 
> priority and daemon status in the factory?
Yes, that should probably be left to the factory and for built-in 
factory would be moved to the InnocuousThreadFactory.
>
> You should clear the Thread intrerruption if you are going to ignore 
> it. Thread.interrupted();
Will do.
>
> I would suggest surrounding the thunk.run() with a catch of Throwable 
> or Exception. In the current implementation one bad egg spoils the 
> party for everyone. There is a catch of RuntimeException described as 
> "catch (RuntimeException e) { // ignore exceptions from the cleanup 
> thunk }" but I would suggest that this is insufficiently paranoid.
Good point,  catches more bad eggs.
>
> Consider a pattern like:
>
> private static final ReferenceQueue<Object> weakListeners = new 
> ReferenceQueue<>();
>
>
> private static class CleanerThread extends Thread {
> { setDaemon(true); setPriority(Thread.MIN_PRIORITY); }
>     @Override
>     @SuppressWarnings("unchecked")
>     public void run() {
>     // Using weak ref to queue allows shutdown if class is unloaded
>     WeakReference<ReferenceQueue<Object>> weakQueue = new 
> WeakReference<>(weakListeners);
>     ReferenceQueue<Object> queue = null;
>     while((queue = (queue == null ? weakQueue.get() : queue) != null) 
> try {
>       Object dead = queue.remove(10000);
>       if(dead != null) {
>          // do stuff with "dead"
>       } else {
>         queue = null; // recheck to see if queue is gone.
>       }
>     } catch(InterruptedException woken) {
>       Thread.interrupted();
>     }
>   }
> }
>
> When 'weakListeners' is cleared when the containing class is unloaded 
> then the thread will shut down after roughly 10 seconds.
>
> I have been meaning to check whether CleanerThread needs to be in a 
> separate class--an inner class, even a static one, may prevent it's 
> containing class from being GCed. IDK.
I think that 'nested' classes aka  static class has no links to the 
outer class and can be GC'ed but will check.

Thanks, Roger





More information about the core-libs-dev mailing list