2012-06-19 5 views
9

अभी मैं निर्माता/उपभोक्ता धागा बनाने की कोशिश कर रहा हूं, निर्माता धागा अक्षरों के सभी संभावित संयोजनों के माध्यम से जाता है और उनके संबंधित एमडी 5 हैश बनाता है। फिर प्रत्येक संयोजन और इसके हैश को HashMap<String,String> में रखा जाता है। अब मेरे उपभोक्ता धागे में मैं हैशपैप पर Queue<> संग्रह का उपयोग करने में सक्षम होना चाहता हूं, इसलिए मेरा उपभोक्ता धागा poll() आदि पर कॉल कर सकता है इस प्रकार Queue जैसे मूल्य एटीसी को हटा रहा है, लेकिन poll() पर कॉल करते समय मुझे संयोजन और उसके हैश दोनों को देखने की क्षमता दे रही है मैं ऐसा कैसे कर पाऊंगा? मेरे पास HashMap है लेकिन यह नहीं पता कि कैसे 'बनाना' या इसे कतार के रूप में डालना है। धन्यवाद।क्या हैश मैप सेट के लिए एक कतार बनाना संभव है?

उत्तर

7

आपको अपने कोड की थ्रेड-सुरक्षा को संभाले बिना हैश मैप का उपयोग नहीं करना चाहिए। अन्यथा, आप लाइव-लॉक के साथ समाप्त हो सकते हैं।

कुंजी को डालने के क्रम में अपने मानचित्र को फिर से चलाने में सक्षम होने के लिए, आप एक LinkedHashMap का उपयोग कर सकते हैं।

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

निर्माता इस (कुछ खास नहीं) की तरह प्रविष्टियों धक्का होगा:

m.put(key, object) 

उपभोक्ता इस तरह प्रविष्टियों मतदान होगा:

while (someCondition) { 
    Map.Entry nextEntry = null; 

    // This block is equivalent to polling 
    { 
     synchronized(s) { 
      Iterator i = s.iterator(); // Must be in the synchronized block 
      if (i.hasNext()) { 
       nextEntry = i.next(); 
       i.remove(); 
      } 
     } 
    } 

    if (nextEntry != null) { 
     // Process the entry 
     ... 
    } else { 
     // Sleep for some time 
     ... 
    } 
    // process 
} 
+0

धन्यवाद, यह एक आकर्षण काम करता था और इसे लागू करने के लिए त्वरित, आसान और स्पष्ट था –

5

LinkedHashMap प्रकार एक HashMap और एक Queue का एक संयोजन तरह है - यह कुंजी/मान जोड़े संग्रहीत करता है, लेकिन यह भी वे किस क्रम में डाला गया याद रखता है। यह वही प्रकार हो सकता है जिसे आप ढूंढ रहे हैं। poll() फ़ंक्शन कोई स्पष्ट नहीं है, लेकिन यदि आपको LinkedHashMap पर एक इटेटरेटर मिलता है तो आप उस क्रम में तत्वों पर जायेंगे, जिसमें वे जोड़े गए थे। आप शायद इस तरह एक समारोह लिख सकते हैं:

public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) { 
    assert !map.isEmpty(); 
    return map.iterator().next(); 
} 

जो आपको पहला तत्व वापस देगा। बस उचित रूप से सिंक्रनाइज़ करना सुनिश्चित करें।

वैकल्पिक रूप से, तुम सिर्फ एक सहायक वर्ग Pair को परिभाषित करने और फिर कतार में Pair रों भंडारण के द्वारा एक Queue अंदर कुंजी/मान जोड़े संग्रहीत करने पर विचार कर सकता है।

आशा है कि इससे मदद मिलती है!

+0

अच्छा, तो वह सिर्फ करने के लिए कुछ SyncObject की आवश्यकता होगी संकेतक जब उपभोक्ता पक्ष पर LinkedHashMap से पढ़ना संभव है। –

+0

हाय, लिंक्ड हैशैप थ्रेड-सुरक्षित नहीं है और यह कतार के प्रकार का नहीं है। – sperumal

+0

@ सेपरूमल- मैंने कभी इनकार नहीं किया कि इनमें से कोई भी मामला था। मैंने माना कि ओपी सिंक्रनाइज़ेशन कोड की आपूर्ति करेगा। साथ ही, मुझे विश्वास नहीं है कि कोई आवश्यकता है कि यह 'कतार' प्रकार का होना चाहिए; ओपी का सवाल कभी इसका उल्लेख नहीं करता है। यदि यह एक आवश्यकता है, तो यह दृष्टिकोण निश्चित रूप से काम नहीं करेगा। – templatetypedef

4

मैं तुम्हें EntrySet की एक पंक्ति बनाने की सलाह -

Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>(); 
for (EntrySet<String,String> entry:map.entrySet()) { 
    queue.add(entry); 
} 

आप कतार का एक और प्रकार है, जो आप गैर खाली ऐसे LinkedBlockingQueue के रूप में के मामले में तत्वों, और केवल prdocuer प्रतीक्षा करता है डाल सकते हैं उपयोग करने पर विचार कर सकते हैं।
निर्माता तब आवश्यकतानुसार एंट्रीसेट ऑब्जेक्ट्स के आधार पर एक मानचित्र को पुन: संकलित करने में सक्षम होगा।

+0

हम्म यह एक अच्छी विधि की तरह लगता है। धन्यवाद, मैं इसे आज़मा दूंगा। एक सवाल यह है कि यह धागा सुरक्षित है? –

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