मुझे अब दो बार एक समस्या का सामना करना पड़ा है जिससे निर्माता निर्माता थ्रेड एन कार्य आइटम उत्पन्न करता है, उन्हें ExecutorService
पर सबमिट करता है और फिर सभी एन आइटम संसाधित होने तक प्रतीक्षा करने की आवश्यकता होती है।लचीला CountDownLatch?
चेतावनियां
- एन अग्रिम में ज्ञात नहीं है। अगर ऐसा होता तो मैं बस
CountDownLatch
बनाउंगा और उसके बाद निर्माता थ्रेडawait()
होगा जब तक कि सभी काम पूरा नहीं हो जाते। - का उपयोग करते हुए एक
CompletionService
अनुचित है क्योंकि ऐसा होने पर मेरा निर्माता धागा ब्लॉक करने के लिए की जरूरत है (अर्थातtake()
फोन करके) संकेत सब काम पूरा है कि का कोई रास्ता नहीं है, इंतज़ार कर बंद करने के लिए निर्माता धागा पैदा करने के लिए।
मेरे वर्तमान इष्ट समाधान एक पूर्णांक काउंटर का उपयोग करना है, और वेतन वृद्धि को यह जब भी काम के एक आइटम प्रस्तुत और घटती है यह जब एक काम मद संसाधित किया जाता है। सभी एन कार्यों के सबमिशन के बाद मेरे निर्माता थ्रेड को लॉक पर इंतजार करना होगा, यह जांच कर लें कि counter == 0
चाहे इसे अधिसूचित किया गया हो। उपभोक्ता धागा (रों) अगर यह काउंटर कम कर दिया है और नया मान 0.
इस समस्या का एक बेहतर दृष्टिकोण है है या वहाँ java.util.concurrent
में एक उपयुक्त निर्माण मैं नहीं बल्कि का उपयोग करना चाहिए है निर्माता को सूचित करने की आवश्यकता होगी "अपना खुद का रोलिंग" से?
अग्रिम धन्यवाद।
निर्माता किस समय पता लगाता है कि कितने काम आइटम हैं? जब आखिरी वस्तु का उत्पादन किया गया है? –
आपका वर्तमान समाधान रेस हालत से पीड़ित हो सकता है: आइटम 1 -> काउंटर ++ -> प्रक्रिया आइटम 1 -> काउंटर-- -> आइटम 2 का उत्पादन करें। चूंकि निर्माता ने अगले आइटम का उत्पादन करने से पहले काउंटर को कम कर दिया है, निर्माता सोचता है कि वह तैयार है। –
@rwwilden: आप इस परिदृश्य में सही हो सकते हैं। हालांकि, मेरे निर्माता केवल * सभी * कार्य वस्तुओं को सबमिट करने के बाद काउंटर पर निरीक्षण/प्रतीक्षा करेंगे और इसलिए यह इस विशेष मामले में दौड़ की स्थिति का प्रतिनिधित्व नहीं करता है। – Adamski