2010-04-29 17 views
5

जिस परियोजना पर मैं काम कर रहा हूं उसे डेटाबेस की ओर से प्रश्नों की पूरी गुच्छा की आवश्यकता है। एक्सेल फ़ाइल सेजावा में संग्रह को संशोधित करने वाले एकाधिक धागे?

  1. पढ़ा, मानकों के एक जोड़े के लिए जाँच करें और डेटाबेस में हिट के लिए एक प्रश्न करते हैं: सिद्धांत रूप में मैं उपयोग कर रहा हूँ प्रश्नों के दो प्रकार के होते हैं। इन हिट को तब कस्टम कक्षाओं की एक श्रृंखला के रूप में पंजीकृत किया जाता है। कोई हिट (और सबसे अधिक संभावना होगी) एक से अधिक बार हो सकती है, इसलिए कोड का यह हिस्सा एक कस्टम सूची कार्यान्वयन में घटना को जांचता है और अद्यतन करता है जो ArrayList को बढ़ाता है। प्रत्येक हिट के लिए

  2. , एक विस्तृत क्वेरी करें और आउटपुट पार्स करें, ताकि (I) में बनाए गए वर्गों को विस्तृत जानकारी मिल सके।

मुझे लगा कि मैं समय-समय पर अनुकूलित करने के लिए एकाधिक धागे का उपयोग करूंगा। हालांकि मैं वास्तव में उन समस्याओं को हल करने के लिए एक अच्छा तरीका नहीं आ सकता जो संग्रह के साथ होता है इन वस्तुओं को संग्रहीत किया जाता है। थोड़ा विस्तार करने के लिए; निष्पादन वस्तुओं के दौरान दोनों (i) और (II) द्वारा संशोधित किया जाना चाहिए।

मैंने जानबूझकर किसी भी कोड को सी/पी नहीं किया, क्योंकि यह किसी भी अर्थ के लिए कोड का बड़ा हिस्सा होगा .. मुझे उम्मीद है कि यह ऊपर दिए गए विवरण के साथ कुछ समझ में आता है।

धन्यवाद,

उत्तर

8

जावा 5 में और इसके बाद के संस्करण, आप या तो CopyOnWriteArrayList या एक synchronized wrapper around your list उपयोग कर सकते हैं। पहले जावा संस्करणों में, केवल बाद की पसंद उपलब्ध है। वही सच है यदि आप पूरी तरह से कस्टम ArrayList कार्यान्वयन का उल्लेख करना चाहते हैं।

CopyOnWriteArrayList संभव है यदि कंटेनर लिखित (बदले गए) से अधिक बार पढ़ा जाता है, जो आपके स्पष्टीकरण के आधार पर सच साबित होता है। इसकी परमाणु addIfAbsent() विधि आपके कोड को सरल बनाने में भी मदद कर सकती है।

[अद्यतन] दूसरे विचार पर, एक नक्शा आपके द्वारा वर्णित उपयोग के मामले में अधिक उपयुक्त लगता है। तो यदि किसी सूची से बदलना उदा। नक्शा एक विकल्प है, आपको ConcurrentHashMap पर विचार करना चाहिए। [/ अद्यतन]

कंटेनर के भीतर वस्तुओं को बदलना कंटेनर को स्वयं प्रभावित नहीं करता है, हालांकि आपको यह सुनिश्चित करने की आवश्यकता है कि ऑब्जेक्ट स्वयं थ्रेड-सुरक्षित हैं।

+0

CopyOnWriteArrayList एक बहुत धीमी (और याददाश्त भूख) डेटा संरचना है - यह ऐरेलिस्ट को भी विस्तारित नहीं करता है ताकि वह ConcurrentLinkedQueue जैसे अधिक प्रभावशाली वर्ग का उपयोग कर सके। – Gandalf

+0

इसके अलावा, जब तक आप किसी निर्माता/उपभोक्ता मॉडल से चिपके रहते हैं (यानी एक धागा कतार से किसी ऑब्जेक्ट को हटा देता है, इसे संपादित करता है, फिर उसे वापस (या एक अलग कतार में) रखता है) तो ऑब्जेक्ट्स को स्वयं को थ्रेड होने की आवश्यकता नहीं होती है -सुरक्षित। – Gandalf

+0

@ गैंडफ, CopyOnWriteArrayList केवल लिखने पर धीमा है। मेरे ऊपर उपरोक्त पद में वर्णित क्या है, निर्माता-उपभोक्ता मॉडल से बहुत अलग है, इसलिए कतार एक विकल्प नहीं है। –

3

बस नए java.util.concurrent पैकेज का उपयोग करें।

ConcurrentLinkedQueue और ConcurrentHashMap जैसी कक्षाएं पहले से ही आपके उपयोग के लिए हैं और सभी थ्रेड-सुरक्षित हैं।

+0

वे अच्छी तरह से काम करते हैं :) –

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