ArrayList <WeakReference > – 如何整理好?

两者之间的一个简单问题:我有一个简单的WeakRunnableList。 这样可以清理它 (删除死引用),还是有一个更优雅,更快的解决方案。 WeakRunnableList的完整源代码:

public class WeakRunnableList { private ArrayList<WeakReference> _items = new ArrayList<WeakReference>(); public void Add(Runnable r) { _items.add(new WeakReference(r)); } public void Execute() { ArrayList<WeakReference> remove = new ArrayList<WeakReference>(); for (WeakReference item : _items) { Runnable tempCheck = item.get(); if (tempCheck == null) { remove.add(item); } else { tempCheck.run(); } } _items.removeAll(remove); } } 

这是我的看法。 WeakHashMap自动删除,所以这应该足够了。 请注意Runnable的hashCode / equals语义。

另请参见WeakHashMap的keySet条目是否永远不为空? WeakHashMap迭代和垃圾收集

 import java.util.WeakHashMap; public class WeakRunnableList { private WeakHashMap _items = new WeakHashMap(); public void Add(Runnable r) { _items.put(r, null); } public void Execute() { Iterator iterator = _items.keySet().iterator(); while (iterator.hasNext()) { Runnable runnable = iterator.next(); if (runnable != null) { runnable.run(); iterator.remove(); } } } } 

在调用item.get()之间存在竞争条件。 我会将item.get()放入局部变量并使用它。