2015-11-26 14 views
6

जावा 8 में एसिंक्रोनस कंप्यूटेशंस शुरू करने के दो तरीके हैं - CompletableFuture और ForkJoinTask। वे दोनों काफी समान दिखते हैं - CompletableFuture के आंतरिक वर्ग भी ForkJoinTask का विस्तार करते हैं।फोर्कजोइन टास्क बनाम CompletableFuture

क्या एक दूसरे का उपयोग करने का कोई कारण है?

एक प्रमुख अंतर यह है कि मैं देख सकता हूँ CompletableFuture.join विधि बस ब्लॉक भविष्य पूरा हो गया है जब तक कि है, जबकि एक ForkJoinTask.join कतार बंद काम चोरी कार्य आप पर शामिल हो रहे हैं मदद करने के लिए कर सकते हैं (waitingGet सिर्फ एक ManagedBlocker का उपयोग कर घूमती है) पूरा करना।

क्या एक या दूसरे पर कोई लाभ है?

उत्तर

3

वे दो अलग बातें हैं, ForkJoinTask एक काम है कि एक ForkJoinPool को प्रस्तुत किया जा सकता है, CompletableFuture एक वादा है कि किसी भी Executor और निष्पादक साथ काम कर सकते ForkJoinPool होने की जरूरत नहीं है,

यह है सच तथापि कि आम ForkJoinPool डिफ़ॉल्ट है अगर आप किसी भी निर्दिष्ट नहीं करते, पूर्व के लिए:

CompletableFuture.supplyAsync(()-> supplier); 

ForkJoinPool का उपयोग करता है अगर आप एक Executor उत्तीर्ण नहीं होते हैं। एक और overload है जो Executor लेता है।

CompletableFuture.supplyAsync(()-> supplier,executor); 

Async, जो CompletableFuture में एक static वर्ग ForkJoinTask<Void> फैली हुई है, लेकिन यह के रूप में या तो कार्य कर सकते हैं, एक ForkJoinTask होने की जरूरत नहीं है Async

/** बेस वर्ग के डॉक्स से है एफजे या सादे Runnable */

abstract static class Async extends ForkJoinTask<Void> 
    implements Runnable, AsynchronousCompletionTask 

यह भी एककर सकते हैंऔर एक AsynchronousCompletionTask

बस पक्ष नोट पर

: ForkJoinTask, ForkJoinPool, ForkJoin... कक्षाएं 1.7 में जोड़ा गया था और नहीं 1.8

+0

मुझे लगता है कि मेरा प्रश्न इस बारे में अधिक है कि आप एक का उपयोग कब करेंगे और दूसरे नहीं (मान लें कि आप डिफ़ॉल्ट सामान्य एफजेपी का उपयोग कर रहे हैं)। एक CompletableFuture में शामिल होने पर, क्या यह उस कार्य को पूरा करने में सहायता करता है जिसमें आप शामिल हो रहे हैं? – thecoop

+1

@thecoop मैं नहीं देखता कि आप एक दूसरे के साथ कैसे प्रतिस्थापित कर सकते हैं, CompletableFuture एक वादा है जिसमें ऑपरेशन है जैसे बस और फिर मान लीजिए, अब अगर आपका प्रश्न फोर्कजोइन टास्क का उपयोग करता है तो? मैं कहूंगा कि जब आप अपने समांतर एल्गोरिदम लिखते हैं –

1

मैं कहना चाहता हूँ कि ForkJoinTask अधिक की सिफारिश की है आप एक बड़ा कार्य है और विभाजित करना चाहते हैं जब यह कई उप कार्यों में समानांतर में चलाने के लिए। ForkJoin ढांचा कार्य चोरी एल्गोरिदम का उपयोग करता है जो धागे का एक कुशल उपयोग करेगा। दूसरी तरफ, CompletableFutures एक प्रतिक्रियाशील प्रोग्रामिंग मॉडल के लिए अधिक उपयुक्त है, जहां आप सिंक या एसिंक फैशन में निष्पादन की पाइपलाइन बना सकते हैं, और निष्पादक सेवा के थ्रेड पूल का उपयोग कर धागे का बेहतर नियंत्रण कर सकते हैं।

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