আমার একটি পদ্ধতি আছে যা 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;
}
}
}
তবে এখানে সমস্যাটি হল, উদাহরণস্বরূপ, চতুর্থ ভবিষ্যত যদি একটি ব্যতিক্রম ছুঁড়ে ফেলে তবে আমি প্রথম 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
জড়িয়ে রাখেন তবে আপনি এটি ব্যবহার করতে পারেন ।