मेरे पास कुछ रिपोजिटरी क्लास पर एक विधि है जो CompletableFuture
देता है। कोड जो इन वायदा को पूरा करता है, एक थर्ड पार्टी लाइब्रेरी का उपयोग करता है जो ब्लॉक करता है। मेरा इरादा अलग-अलग Executor
है जो इस भंडार वर्ग को इन अवरुद्ध कॉल करने के लिए उपयोग करेगा।जावा CompletableFutures लिखते समय कौन सा निष्पादक उपयोग किया जाता है?
यहाँ एक उदाहरण है:
public class PersonRepository {
private Executor executor = ...
public CompletableFuture<Void> create(Person person) {...}
public CompletableFuture<Boolean> delete(Person person) {...}
}
अपने आवेदन परिणामों के साथ इन वायदा कुछ अन्य बातों लिखें और क्या करेंगे के बाकी। जब इन अन्य कार्यों को thenAccept
, thenCompose
, whenComplete
, आदि के लिए आपूर्ति की जाती है, तो मैं नहीं चाहता कि वे भंडार के लिए Executor
पर चलें।
एक और उदाहरण:
public CompletableFuture<?> replacePerson(Person person) {
final PersonRepository repo = getPersonRepository();
return repo.delete(person)
.thenAccept(existed -> {
if (existed) System.out.println("Person deleted"));
else System.out.println("Person did not exist"));
})
.thenCompose(unused -> {
System.out.println("Creating person");
return repo.create(person);
})
.whenComplete((unused, ex) -> {
if (ex != null) System.out.println("Creating person");
repo.close();
});
}
JavaDoc कहता है:
क्रिया गैर async तरीकों में से निर्भर पूर्ण करने के लिए आपूर्ति की, या किसी अन्य द्वारा धागा है कि मौजूदा CompletableFuture पूरा करता है के द्वारा किया जा सकता है एक समापन विधि के कॉलर।
साइड प्रश्न: क्यों वहाँ एक या यहाँ है? किस मामले में एक पूर्णता विधि का एक और कॉलर है जो वर्तमान भविष्य को पूरा नहीं करता है?
मुख्य प्रश्न: मैं सभी println
, एक अलग Executor
भंडार द्वारा इस्तेमाल किया एक से द्वारा निष्पादित की जाने जो तरीकों मैं async बनाने के लिए और मैन्युअल निष्पादक प्रदान करने की आवश्यकता है चाहते हैं?
स्पष्ट रूप से thenAccept
को thenAcceptAsync
में बदला जाना आवश्यक है, लेकिन मुझे उस बिंदु के बारे में निश्चित नहीं है।
वैकल्पिक प्रश्न: कौन सा धागा thenCompose
से लौटा हुआ भविष्य पूरा करता है?
मेरा अनुमान है कि यह थ्रेड होगा जो भविष्य में फ़ंक्शन तर्क से लौटाए गए भविष्य को पूरा करेगा। दूसरे शब्दों में मुझे whenComplete
से whenCompleteAsync
को भी बदलने की आवश्यकता होगी।
शायद मैं जटिल चीजों से अधिक हूं लेकिन ऐसा लगता है कि यह काफी मुश्किल हो सकता है। मुझे बहुत ध्यान देना होगा कि ये सभी वायदा कहाँ से आते हैं। एक डिजाइन बिंदु से भी, यदि मैं भविष्य लौटाता हूं, तो मैं कॉलर्स को अपने निष्पादक का उपयोग करने से कैसे रोकूं? ऐसा लगता है जैसे यह encapsulation तोड़ता है। मुझे पता है कि स्कैला में सभी परिवर्तन कार्य एक अंतर्निहित ExecutionContext
लेते हैं जो इन सभी समस्याओं को हल करने लगता है।
उस लेख को पढ़ें - http://www.nurkiewicz.com/2015/11/which-thread-executes.html। यह थ्रेड पर प्रकाश को छाया करने में मदद करता है – rvit34