diff options
Diffstat (limited to 'guava/src/com/google/common/base/internal/Finalizer.java')
-rw-r--r-- | guava/src/com/google/common/base/internal/Finalizer.java | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/guava/src/com/google/common/base/internal/Finalizer.java b/guava/src/com/google/common/base/internal/Finalizer.java index ebef272..6be4eec 100644 --- a/guava/src/com/google/common/base/internal/Finalizer.java +++ b/guava/src/com/google/common/base/internal/Finalizer.java @@ -46,7 +46,7 @@ import java.util.logging.Logger; * class loader from getting garbage collected, and this class can detect when * the main class loader has been garbage collected and stop itself. */ -public class Finalizer implements Runnable { +public class Finalizer extends Thread { private static final Logger logger = Logger.getLogger(Finalizer.class.getName()); @@ -59,16 +59,13 @@ public class Finalizer implements Runnable { * Starts the Finalizer thread. FinalizableReferenceQueue calls this method * reflectively. * - * @param finalizableReferenceClass FinalizableReference.class. - * @param queue a reference queue that the thread will poll. - * @param frqReference a phantom reference to the FinalizableReferenceQueue, which will be - * queued either when the FinalizableReferenceQueue is no longer referenced anywhere, or when - * its close() method is called. + * @param finalizableReferenceClass FinalizableReference.class + * @param frq reference to instance of FinalizableReferenceQueue that started + * this thread + * @return ReferenceQueue which Finalizer will poll */ - public static void startFinalizer( - Class<?> finalizableReferenceClass, - ReferenceQueue<Object> queue, - PhantomReference<Object> frqReference) { + public static ReferenceQueue<Object> startFinalizer( + Class<?> finalizableReferenceClass, Object frq) { /* * We use FinalizableReference.class for two things: * @@ -82,42 +79,40 @@ public class Finalizer implements Runnable { "Expected " + FINALIZABLE_REFERENCE + "."); } - Finalizer finalizer = new Finalizer(finalizableReferenceClass, queue, frqReference); - Thread thread = new Thread(finalizer); - thread.setName(Finalizer.class.getName()); - thread.setDaemon(true); - - try { - if (inheritableThreadLocals != null) { - inheritableThreadLocals.set(thread, null); - } - } catch (Throwable t) { - logger.log(Level.INFO, "Failed to clear thread local values inherited" - + " by reference finalizer thread.", t); - } - - thread.start(); + Finalizer finalizer = new Finalizer(finalizableReferenceClass, frq); + finalizer.start(); + return finalizer.queue; } private final WeakReference<Class<?>> finalizableReferenceClassReference; private final PhantomReference<Object> frqReference; - private final ReferenceQueue<Object> queue; + private final ReferenceQueue<Object> queue = new ReferenceQueue<Object>(); private static final Field inheritableThreadLocals = getInheritableThreadLocalsField(); /** Constructs a new finalizer thread. */ - private Finalizer( - Class<?> finalizableReferenceClass, - ReferenceQueue<Object> queue, - PhantomReference<Object> frqReference) { - this.queue = queue; + private Finalizer(Class<?> finalizableReferenceClass, Object frq) { + super(Finalizer.class.getName()); this.finalizableReferenceClassReference = new WeakReference<Class<?>>(finalizableReferenceClass); // Keep track of the FRQ that started us so we know when to stop. - this.frqReference = frqReference; + this.frqReference = new PhantomReference<Object>(frq, queue); + + setDaemon(true); + + try { + if (inheritableThreadLocals != null) { + inheritableThreadLocals.set(this, null); + } + } catch (Throwable t) { + logger.log(Level.INFO, "Failed to clear thread local values inherited" + + " by reference finalizer thread.", t); + } + + // TODO(fry): Priority? } /** @@ -208,5 +203,5 @@ public class Finalizer implements Runnable { /** Indicates that it's time to shut down the Finalizer. */ @SuppressWarnings("serial") // Never serialized or thrown out of this class. - private static class ShutDown extends Exception {} + private static class ShutDown extends Exception { } } |