使用ReferenceQueue和WeakReference

我想在其他线程不再引用Closeable对象时正确关闭它。

我写了一些小测试,但是在对象入队后get方法返回null,即poll方法返回没有指示对象的正确Object。

public static void main(String[] args) { ReferenceQueue reaped = new ReferenceQueue(); Closeable s = ; WeakReference ws = new WeakReference(s, reaped); s = null; System.gc(); Closeable ro = (Closeable)reaped.poll().get(); ro.close(); } 

提前致谢。 任何帮助将不胜感激。

首先,如果它只是关闭,请使用PhantomReference 。 接下来,从参考队列中, poll()不保证您将获得引用。 而且你永远不会得到实际的物体(指示物)。

如果你想确保Closeable s关闭,你必须自己跟踪它们,让我们在Map, Closeable> 。 然后,当您poll()您的引用队列时,您最终将获得ref然后您必须使用它从地图中获取Closeable

  class MyThing { Closeable c; } Map, Closeable> m = new HashMap(); ReferenceQueue reaped = new ReferenceQueue(); MyThing mt = new MyThing(); mt.c = new MyClosable(); Reference pref = new PhantomReference(mt, reaped); m.put(pref, mt.c); mt = null; System.gc(); Reference rf = reaped.poll(); while (rf != null) { m.get(rf).close(); rf = reaped.poll(); } 

注意如果您没有真正的理由这样做,或者您不明白自己在做什么,请不要这样做。

您可以在finally关闭文件和BTW,如果它是关于文件,套接字等,它们是关闭的(他们已经实现了finalize()