我有一个对象Producer
,它在内部启动一个线程来监听一些网络事件,并且大多数情况下阻塞receive()
方法。在这个Producer
对象中,我有一个WeakHashMap<Integer, Vector<IConsumer>>
包含哈希映射,其中键是Producer
可以生成的事件,值是已在这些事件上注册的使用者列表。
现在我有一个Main
对象构造了一些Manager
。 Manager
构建了一个Producer
和任意数量的ConcreteConsumers implements IConsumer
。 Manager
包含对Producer
和ConcreteConsumer
的引用。
这是一个有效的结构,Vector<IConsumer>
插入WeakHashMap<Integer, Vector<IConsumer>>
后,Producer
是否不符合GC的条件,因为没有参考实际的向量?仅直接引用ConcreteConsumer
和Main
。如果是这样,我该如何解决?
接下来发生的事情是Manager
对象删除了对ConcreteConsumers
的引用,这会导致所有Producer
符合GC的条件,这就是我想要的。
但是,我还希望实际的{{1}}对象符合GC条件,并且内部线程在此时停止执行。有关如何执行此操作的任何建议吗?
答案 0 :(得分:2)
这是WeakHashMap
中具有弱引用的关键。该值被强烈引用。在没有对密钥的强引用后,该条目将被删除,在这种情况下为Integer
。这是Integer
的完全相同的实例,而不仅仅是具有相同值的实例。值类型作为WeakHashMap
的键不是特别有用。
(WeakHashMap
作为缓存无用(您希望使用SoftReference
s,可能还有其他人的库)。)