ArrayList<WeakReference<Runnable>> - 如何最好地进行整理?

7

我有一个简单的WeakRunnableList,想问一个问题:这种方法是否可以清理它(删除无效引用),还是有更加优雅和快速的解决方案。以下是我的WeakRunnableList的完整源代码:

public class WeakRunnableList
{
    private ArrayList<WeakReference<Runnable>> _items = new ArrayList<WeakReference<Runnable>>();

    public void Add(Runnable r)
    {
        _items.add(new WeakReference<Runnable>(r));
    }

    public void Execute()
    {
        ArrayList<WeakReference<Runnable>> remove = new ArrayList<WeakReference<Runnable>>();
        for (WeakReference<Runnable> item : _items)
        {
            Runnable tempCheck = item.get();
            if (tempCheck  == null)
            {
                remove.add(item);
            }
            else
            {
                tempCheck.run();
            }
        }
        _items.removeAll(remove);
    }
}
2个回答

9
以下是我的观点。 WeakHashMap 会自动删除,所以这应该就足够了。但要注意 Runnable 的 hashCode/equals 语义。
另请参阅: keySet 中的 WeakHashMap 条目是否永远不为空? WeakHashMap 迭代和垃圾收集
import java.util.WeakHashMap;

public class WeakRunnableList
{
    private WeakHashMap<Runnable, Void> _items = new WeakHashMap<Runnable, Void>();

    public void Add(Runnable r)
    {
        _items.put(r, null);
    }

    public void Execute()
    {
        Iterator<Runnable> iterator = _items.keySet().iterator();
        while (iterator.hasNext()) {
            Runnable runnable = iterator.next();
            if (runnable != null) {
                runnable.run();
                iterator.remove();
            }
        }
    }
}

1

您在调用item.get()之间存在竞争条件。我建议将item.get()放入本地变量中并使用它。


谢谢您的评论。实际上我已经纠正了,会在文章中进行更改 :-) - Christian Ruppert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接