2017-04-05 11 views
5

की सूची पर स्ट्रीम करने का सबसे प्रभावी तरीका मैं वस्तुओं की सूची पर स्ट्रीमिंग करके एसिंक क्लाइंट विधि को कॉल कर रहा हूं। विधि भविष्य लौटाता है।फ्यूचर्स

कॉल के बाद लौटाए गए फ़्यूचर्स की सूची में पुन: प्रयास करने का सबसे अच्छा तरीका क्या है (ताकि उन भविष्य को संसाधित करने के लिए जो पहले आता है)?

नोट: एसिंक क्लाइंट केवल भविष्य को पूरा करने वाला भविष्य नहीं देता है।

के बाद कोड है:

List<Future<Object>> listOfFuture = objectsToProcess.parallelStream() 
    .map((object) -> { 
     /* calling an async client returning a Future<Object> */ }) 
    .collect(Collectors.toList()); 
+0

आप एक CompletionService का उपयोग कर के बजाय एक सरणी के लिए परिणाम मानचित्रण पर गौर किया? http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CompletionService.html –

+0

शायद [CompletionService] का प्रयास करें (http://docs.oracle.com/javase/7/docs/ एपीआई/जावा/util/समवर्ती/CompletionService.html)? यहां एक [स्पष्टीकरण] है (http://stackoverflow.com/a/19348417/6785649)। –

+3

'CompletionService' काफी बेकार है यदि आपके पास उस कोड पर नियंत्रण नहीं है जो' भविष्य 'बनाता है/नौकरी को' निष्पादक 'को प्रस्तुत करता है। – Holger

उत्तर

3

List<Future<Object>> की इस सूची के बाद, मैं इसे एक कस्टम पूल के लिए प्रस्तुत होता है, बजाय डिफ़ॉल्ट स्ट्रीम समानांतर प्रसंस्करण का उपयोग करने का।

ऐसा इसलिए है क्योंकि स्ट्रीम एपीआई समानांतर प्रसंस्करण के लिए एक सामान्य पूल का उपयोग करता है और आप उन फ्यूचर्स पर get पर कॉल करेंगे (यदि यह प्रसंस्करण के लिए महत्वपूर्ण समय लेता है) - आप अन्य सभी स्ट्रीम ऑपरेशंस को अवरुद्ध करेंगे जो आपके आवेदन के भीतर समानांतर संचालन का उपयोग करते हैं यह एक किया जाता है।

यह होगा इस तरह एक सा:

forJoinPool.submit(() -> list.stream().parallel().map(future -> future.get()).collect(Collectors.toList())).get(); 

मैं की तरह एक कस्टम पूल के साथ जाना होगा दिखाया here

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