1 16 17 package com.google.inject.util; 18 19 import java.lang.ref.Reference ; 20 import java.lang.ref.ReferenceQueue ; 21 import java.util.logging.Level ; 22 import java.util.logging.Logger ; 23 24 29 class FinalizableReferenceQueue extends ReferenceQueue <Object > { 30 31 private static final Logger logger = 32 Logger.getLogger(FinalizableReferenceQueue.class.getName()); 33 34 private FinalizableReferenceQueue() {} 35 36 void cleanUp(Reference reference) { 37 try { 38 ((FinalizableReference) reference).finalizeReferent(); 39 } catch (Throwable t) { 40 deliverBadNews(t); 41 } 42 } 43 44 void deliverBadNews(Throwable t) { 45 logger.log(Level.SEVERE, "Error cleaning up after reference.", t); 46 } 47 48 void start() { 49 Thread thread = new Thread ("FinalizableReferenceQueue") { 50 public void run() { 51 while (true) { 52 try { 53 cleanUp(remove()); 54 } catch (InterruptedException e) { } 55 } 56 } 57 }; 58 thread.setDaemon(true); 59 thread.start(); 60 } 61 62 static final ReferenceQueue <Object > instance = createAndStart(); 63 64 static FinalizableReferenceQueue createAndStart() { 65 FinalizableReferenceQueue queue = new FinalizableReferenceQueue(); 66 queue.start(); 67 return queue; 68 } 69 70 73 public static ReferenceQueue <Object > getInstance() { 74 return instance; 75 } 76 } 77 | Popular Tags |