2011-12-21 11 views
6

Una pregunta rápida entre: Tengo una WeakRunnableList simple. Es de esta manera bien para limpiarlo (eliminando las referencias muertas), o hay una solución más elegante y más rápida. Fuente completa para mi WeakRunnableList:ArrayList <WeakReference <Runnable>> - ¿Cómo ordenar mejor?

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); 
    } 
} 

Respuesta

6

Aquí está mi opinión. WeakHashMap elimina automáticamente, por lo que esto debería ser suficiente. Sin embargo, ten cuidado con hashCode/equal semántica de Runnable.

Ver también 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(); 
      } 
     } 
    } 
} 
1

Tiene una condición de carrera entre las llamadas a item.get(). Colocaría item.get() en una variable local y usaría eso.

+0

Gracias por el comentario. En realidad solo lo corrigió, cambiará en la publicación :-) –

Cuestiones relacionadas