2009-09-10 18 views
6

मेरे पास चलाने के लिए समवर्ती कार्यों की एक श्रृंखला है। यदि उनमें से कोई भी विफल रहता है, तो मैं उन सभी को बाधित करना चाहता हूं और समाप्ति का इंतजार करना चाहता हूं। लेकिन मानते हैं कि उनमें से कोई भी असफल नहीं है, मैं उन सभी को खत्म करने के लिए इंतजार करना चाहता हूं।जावा में, मैं सभी कार्यों के लिए कैसे प्रतीक्षा करूं, लेकिन पहली त्रुटि पर रुका?

एक्ज़ीक्यूटोर कॉम्प्लेशन सेवा लगभग जो कुछ भी मैं चाहता हूं, जैसा लगता है, लेकिन यह नहीं बताता कि मेरे सभी कार्यों को पूरा किया गया है, सिवाय इसके कि कार्यों की संख्या अलग-अलग गिनती को छोड़कर। (ध्यान दें कि निष्पादक कॉम्प्लिशन सेवा के लिए जावाडोक के दोनों उदाहरण कार्य के गिनती "एन" का ट्रैक रखते हैं, और यह निर्धारित करने के लिए कि सेवा समाप्त हो गई है या नहीं।)

क्या मैं कुछ देख रहा हूं, या मैं वास्तव में मुझे यह कोड खुद लिखना है?

उत्तर

2

हां, अगर आप एक्जिक्यूटर कॉम्प्लिशन सेवा का उपयोग कर रहे हैं तो आपको ट्रैक रखने की आवश्यकता है। आम तौर पर, आप यह देखने के लिए वायदा पर() को कॉल करेंगे कि कोई त्रुटि हुई है या नहीं। कार्यों पर पुन: प्रयास किए बिना, आप कैसे कह सकते हैं कि कोई असफल रहा?

+0

वह कार्य में त्रुटि की स्थिति को संभाल सकता है, लेकिन हाँ, भविष्य में कॉल() को कॉल करना सबसे अच्छा है। –

+0

मुझे पाठ्यक्रम के कार्यों पर पुन: प्रयास करने की आवश्यकता है, लेकिन मैं केवल execorCompletionService से वायदा ले सकता हूं। (यही वह है जो जावाडोक उदाहरण करता है।) समस्या यह है कि मैं केवल तब तक नहीं ले सकता जब तक कि मैं कार्यों से बाहर नहीं हो जाता, क्योंकि अगर मैं कोई काम नहीं करता हूं, तो मैं हमेशा इंतजार कर रहा हूं। –

+1

ठीक है, इसलिए आपको कार्यों की संख्या को सटीक करने की आवश्यकता है (जैसा कि आपने सोचा था), और इसे कई बार लें। –

1

यदि आपकी कार्य श्रृंखला एक ज्ञात आकार का है, तो आपको javadoc में दूसरे उदाहरण का उपयोग करना चाहिए।

हालांकि, अगर आप उन कार्यों की संख्या नहीं जानते जिन्हें आप CompletionService पर सबमिट करेंगे, तो आपके पास एक प्रकार का निर्माता-उपभोक्ता समस्या है। एक धागा कार्य का उत्पादन कर रहा है और उन्हें ईसीएस में रख रहा है, दूसरा लेक() के माध्यम से कार्य वायदा का उपभोग करेगा। एक साझा सेमफोर का उपयोग किया जा सकता है, जिससे निर्माता को रिलीज() और उपभोक्ता कॉल कॉल() को कॉल करने की अनुमति मिलती है। प्राप्ति semantics आपके आवेदन पर निर्भर करेगा, लेकिन निर्माता पर एक अस्थिर या परमाणु बुलियन यह इंगित करने के लिए कि यह किया जाता है पर्याप्त होगा।

मैं मतदान() के साथ प्रतीक्षा/अधिसूचना पर एक सेमफोर का सुझाव देता हूं क्योंकि कार्य के समय के बीच एक गैर-निर्धारिती देरी होती है और उस समय का कार्य खपत के लिए उपलब्ध होता है। इसलिए उपभोक्ता और निर्माता को थोड़ा सा स्मार्ट होना चाहिए।

+0

वास्तव में, मेरे मामले में, मेरे पास केवल एक मुख्य धागा है जो कार्यों का उत्पादन करता है और वायदा का उपभोग करता है। मैं निश्चित रूप से उस धागे को कार्यों की गिनती का निर्धारिक ट्रैक रख सकता हूं, लेकिन ऐसा लगता है कि मुझे यह करना चाहिए कि मुझे यह करना चाहिए। –

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