A quick question in between: I have a simple WeakRunnableList. Is this way ok to clean it up (removing dead references), or is there a more elegant and fast
Here is my take. WeakHashMap removes autmatically, so this should suffice. Beware of hashCode/equals semantics of Runnable though.
See also Are keySet entries of a WeakHashMap never null? WeakHashMap iteration and garbage collection
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();
}
}
}
}
You have a race condition between calls to item.get(). I would place item.get() into a local variable and use that.