gpt4 book ai didi

java - 使用 ReferenceQueue 和 WeakReference

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:58:44 24 4
gpt4 key购买 nike

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

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

  public static void main(String[] args)
{
ReferenceQueue<Closeable> reaped = new ReferenceQueue<Closeable>();
Closeable s = <SOME CLOSEABLE IMPL>;
WeakReference<Closeable> ws = new WeakReference<Closeable>(s, reaped);
s = null;

System.gc();
Closeable ro = (Closeable)reaped.poll().get();
ro.close();
}

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

最佳答案

首先,如果只是关闭,使用PhantomReference .接下来,从引用队列中,poll()不保证您会取回引用资料。并且您将永远无法取回实际对象(指称对象)。

如果您想确保您的 Closeable s 已关闭,您必须自己跟踪它们让我们在 Map<Reference<?>, Closeable> 中说.那么当你poll()你的引用队列,你最终会得到ref那么你必须使用它来获取 Closeable从 map 上看。

   class MyThing {
Closeable c;
}

Map<Reference<MyThing>, Closeable> m = new HashMap();
ReferenceQueue<MyThing> reaped = new ReferenceQueue<MyThing>();

MyThing mt = new MyThing();
mt.c = new MyClosable();

Reference<MyThing> pref = new PhantomReference<MyThing>(mt, reaped);
m.put(pref, mt.c);

mt = null;


System.gc();
Reference<MyThing> rf = reaped.poll();
while (rf != null) {
m.get(rf).close();
rf = reaped.poll();
}

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

您可以在 finally 中关闭您的文件顺便说一句,如果它是关于文件、套接字等的,它们对你来说是关闭的(它们已经实现了 finalize()

关于java - 使用 ReferenceQueue 和 WeakReference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10878012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com