我有这样的事情:
private Map<MyObj1, MyObj2> map = new WeakHashMap<MyObj1, MyObj2>();
... somewhere in the code ...
MyObj1 myObj1 = new MyObj1();
map.put(myObj1, new MyObj2();
...
myObj1 = null;
... somewhere else in a thread ... (I would like to pass to a checkThis(MyObj2) method the Value associated with the entry that was removed from the Map)
/* something like this maybe */
while (true) {
MyObj2 myObj2 = referenceQueue.remove().get();
checkThis(myObj2);
}
GC进场时可能会删除 MyObj1
键,并且没有强烈的引用。
我想传递给checkThis(MyObj2)
与已删除的密钥相关联的特定地图值对象(可能会检查ReferenceQueue
?)
我无法弄清楚如何将其放入代码中。
答案 0 :(得分:1)
来自对另一个答案的评论:
的工作会话到期后我想要那个 (并没有强烈的参考 那个会话在我的App环境中) 列表是迭代的,取消是 呼吁所有剩余的期货 那些等待被执行的人。这个 避免安排那些工作 即使用户会话即将运行 过期。
答案 1 :(得分:0)
关于你想要做什么的真正问题是WeakHashMap
依赖于垃圾收集器来释放不可用的项目。
由于GC会随时随地完成工作,而不会对您正在做的事情有任何尊重,因此很难跟踪hashmap上的更改。实际上你说的是什么
“当没有强引用时,MyObj1键被删除”
不准确。 MyObj1
可以自由发布,如果它没有强大的参考,但如果没有必要发布它,它就不会被释放。
答案 2 :(得分:0)
来自WeakHashMap序言(斜体添加):
具有弱键的基于哈希表的Map实现。当其密钥不再正常使用时,WeakHashMap中的条目将自动被删除。更确切地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收。当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现的行为略有不同。
然而,当WeakHashMap“失去”一个条目时,你永远不会告诉你:-)如果你只关心特定实例的密钥,那么你可以使用地图扫描(也只适用于某些n)。否则,请继续关注ReferenceQueue。
此链接可能有用:Java Reference Objects
答案 3 :(得分:0)
参考队列
一旦WeakReference开始返回null,它指向的对象就变成了垃圾,WeakReference对象几乎没用。这通常意味着需要进行某种清理;例如,WeakHashMap必须删除这些已经失效的条目,以避免持有越来越多的死WeakReferences。
ReferenceQueue类可以轻松跟踪死引用。如果将ReferenceQueue传递给弱引用的构造函数,则当它引用的对象变为垃圾时,引用对象将自动插入引用队列。然后,您可以定期处理ReferenceQueue并执行死引用所需的任何清理。
See this page有关如何使用的教程。
你能否说明你使用它的原因?有效用途很少 即缓存不是有效用途(或至少不是一个好用途)
编辑:
此代码相当于使用weakHashMap,但您需要显式执行此操作以将队列与地图关联。
HashMap aHashMap = new HashMap();
ReferenceQueue Queue = new ReferenceQueue();
MyWeakReference RefKey = new MyWeakReference(key, Queue);
aHashMap.put(RefKey, value);