मेरे पास एक ऐसा तरीका है जो List
वायदा का रिटर्न देता है
List<Future<O>> futures = getFutures();
अब मैं तब तक इंतजार करना चाहता हूं जब तक कि सभी वायदा सफलतापूर्वक प्रसंस्करण या किसी भी ऐसे कार्य के लिए नहीं किया जाता है जिसका उत्पादन भविष्य में वापस आ जाता है। यहां तक कि अगर एक कार्य एक अपवाद फेंकता है, तो अन्य वायदा के लिए इंतजार करने का कोई मतलब नहीं है।
के लिए सरल दृष्टिकोण होगा
wait() {
For(Future f : futures) {
try {
f.get();
} catch(Exception e) {
//TODO catch specific exception
// this future threw exception , means somone could not do its task
return;
}
}
}
लेकिन यहां समस्या यह है कि, उदाहरण के लिए, 4 वें भविष्य एक अपवाद फेंकता है, तो मैं पहले 3 वायदा उपलब्ध होने के लिए अनावश्यक रूप से इंतजार करूंगा।
इसे कैसे हल करें? किसी भी तरह से कुंडी मदद की गिनती करेगा? मैं भविष्य का उपयोग करने में असमर्थ हूं isDone
क्योंकि जावा डॉक्टर कहते हैं
boolean isDone()
Returns true if this task completed. Completion may be due to normal termination, an exception, or cancellation -- in all of these cases, this method will return true.
ExecutionService
प्रत्येक "बैच" कार्यों के लिए एक उदाहरण बना सकते हैं , उन्हें इसमें जमा कर सकते हैं, फिर तुरंत सेवा बंद कर सकते हैं और awaitTermination()
उस पर उपयोग कर सकते हैं जो मुझे लगता है।
CountDownLatch
यदि आप अपने सभी वायदा के शरीर को लपेटते हैं try..finally
ताकि यह सुनिश्चित किया जा सके कि कुंडी खराब हो गई है।