खेल के लिए थोड़ा देर से लेकिन पूरा होने के लिए ...
सभी कार्यों को पूरा करने के लिए 'प्रतीक्षा' के बजाय, आप हॉलीवुड के सिद्धांत के संदर्भ में सोच सकते हैं, "मुझे कॉल न करें, मैं आपको कॉल करूंगा" - जब मैं समाप्त कर लूंगा। मुझे लगता है कि परिणामी कोड अधिक सुरुचिपूर्ण है ...
अमरूद इसे पूरा करने के लिए कुछ दिलचस्प उपकरण प्रदान करता है।
एक उदाहरण ::
एक ExecutorService को एक ListeningExecutorService में लपेटें ::
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
निष्पादन के लिए कॉलबल्स का एक संग्रह प्रस्तुत करें ::
for (Callable<Integer> callable : callables) {
ListenableFuture<Integer> lf = service.submit(callable);
// listenableFutures is a collection
listenableFutures.add(lf)
});
अब आवश्यक हिस्सा:
ListenableFuture<List<Integer>> lf = Futures.successfulAsList(listenableFutures);
सभी का वायदा पूरा होने पर, सुने जाने योग्य सुने जाने के लिए कॉलबैक संलग्न करें।
Futures.addCallback(lf, new FutureCallback<List<Integer>>() {
@Override
public void onSuccess(List<Integer> result) {
log.info("@@ finished processing {} elements", Iterables.size(result));
// do something with all the results
}
@Override
public void onFailure(Throwable t) {
log.info("@@ failed because of :: {}", t);
}
});
यह भी लाभ प्रदान करता है कि प्रसंस्करण समाप्त होने के बाद आप सभी परिणाम एक ही स्थान पर एकत्र कर सकते हैं ...
अधिक जानकारी यहाँ