2011-12-21 7 views
6

बीच में एक त्वरित प्रश्न: मेरे पास एक साधारण WeakRunnableList है। इस तरह से इसे साफ़ करने के लिए ठीक है (मृत संदर्भों को हटा रहा है), या वहां एक और अधिक सुरुचिपूर्ण और तेज़ समाधान है। मेरे WeakRunnableList के लिए पूर्ण स्रोत:ऐरेलिस्ट <WeakReference <Runnable>> - सबसे अच्छा कैसे साफ करें?

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

उत्तर

6

यहां मेरा लेना है। WeakHashMap स्वचालित रूप से हटा देता है, इसलिए यह पर्याप्त होना चाहिए। हैशकोड से सावधान रहें/हालांकि रननेबल के अर्थशास्त्र के बराबर है।

भी 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

आपके पास item.get() पर कॉल के बीच दौड़ की स्थिति है। मैं item.get() को स्थानीय चर में रखूंगा और इसका उपयोग करूंगा।

+0

टिप्पणी के लिए धन्यवाद देखें। असल में इसे ठीक किया गया, पोस्ट में बदल जाएगा :-) –

संबंधित मुद्दे

 संबंधित मुद्दे