मैंने fork-join framework in Java 7 के बारे में एक महान लेख पढ़ा है, और विचार यह है कि ForkJoinPool
और ForkJoinTask
के साथ, पूल में धागे अन्य कार्यों से उप-कार्य प्राप्त कर सकते हैं, इसलिए यह अधिक कार्यों को संभालने के लिए कम थ्रेड का उपयोग करने में सक्षम है।फोर्कजोइनपूल और सामान्य निष्पादन सेवा के बीच अंतर?
फिर मैंने एक ही काम करने के लिए सामान्य ExecutorService
का उपयोग करने की कोशिश की, और पाया कि मैं अंतर नहीं बता सकता, क्योंकि जब मैं पूल में नया कार्य सबमिट करता हूं, तो कार्य एक और उपलब्ध थ्रेड पर चलाया जाएगा।
एकमात्र अंतर मैं बता सकता हूं कि अगर मैं ForkJoinPool
का उपयोग करता हूं, तो मुझे पूल को कार्य करने की आवश्यकता नहीं है, क्योंकि मैं इसे task.fork()
पर कॉल कर सकता हूं ताकि इसे किसी अन्य थ्रेड पर चल सके। लेकिन सामान्य ExecutorService
के साथ, मुझे पूल को कार्य में पास करना होगा, या इसे स्थिर बनाना होगा, इसलिए कार्य के अंदर, मैं pool.submit(newTask)
क्या मुझे कुछ याद आ सकता है?
(आप https://github.com/freewind/fork-join-test/tree/master/src से रहने वाले कोड देख सकते हैं) हालांकि ForkJoinPool
वहां कुछ लेख हैं जो बताते हैं कि इनमें से कौन सा एक अलग-अलग प्रकार के कार्यों में बेहतर है। जहां तक मुझे लगता है कि फोर्क-जॉइन पूल रिकर्सिव प्रकार के कार्य शेड्यूलिंग के लिए बेहतर (और सुरक्षित) है। एक परिदृश्य में जहां एक कार्य एक ही निष्पादक सेवा (इसे निष्पादित किया जा रहा है) पर नए कार्यों को जन्म देता है, तो एक्जिकलर सेवा के पूल का आकार पर्याप्त नहीं होने पर डेडलॉक का एक बड़ा मौका होता है। हालांकि फोर्क-जॉइन पूल के मामले में यह मामला नहीं है। –