aboutsummaryrefslogtreecommitdiffstats
path: root/guava/src/com/google/common/base/internal/Finalizer.java
diff options
context:
space:
mode:
Diffstat (limited to 'guava/src/com/google/common/base/internal/Finalizer.java')
-rw-r--r--guava/src/com/google/common/base/internal/Finalizer.java61
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 { }
}