2015-05-01 6 views
5

मैंने 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

+2

वहां कुछ लेख हैं जो बताते हैं कि इनमें से कौन सा एक अलग-अलग प्रकार के कार्यों में बेहतर है। जहां तक ​​मुझे लगता है कि फोर्क-जॉइन पूल रिकर्सिव प्रकार के कार्य शेड्यूलिंग के लिए बेहतर (और सुरक्षित) है। एक परिदृश्य में जहां एक कार्य एक ही निष्पादक सेवा (इसे निष्पादित किया जा रहा है) पर नए कार्यों को जन्म देता है, तो एक्जिकलर सेवा के पूल का आकार पर्याप्त नहीं होने पर डेडलॉक का एक बड़ा मौका होता है। हालांकि फोर्क-जॉइन पूल के मामले में यह मामला नहीं है। –

उत्तर

5

लागू करता ExecutorService, यह 'सामान्य' निष्पादकों से conceptionally अलग है।

यदि आपके कार्य अधिक कार्य करते हैं और उन्हें पूरा करने के लिए प्रतीक्षा करते हैं, तो आप आसानी से अंतर देख सकते हैं।

executor.invoke(new Task()); // blocks this thread until new task completes 

सामान्य निष्पादक सेवा में, अन्य कार्यों को पूरा करने की प्रतीक्षा करने से वर्तमान धागे को अवरुद्ध कर दिया जाएगा। दो संभावित परिणाम हैं: यदि आपकी निष्पादक सेवा में धागे की निश्चित संख्या है, तो अंतिम चलने वाला थ्रेड पूरा करने के लिए किसी अन्य कार्य की प्रतीक्षा करता है, तो यह डेडलॉक हो सकता है। यदि आपका निष्पादक गतिशील रूप से मांग पर नए धागे बनाता है, तो धागे की संख्या विस्फोट हो सकती है और आप हजारों धागे होने से भूख पैदा कर सकते हैं।

विपरीत में, कांटा/ढांचे में शामिल होने धागा इस बीच में अन्य कार्यों को निष्पादित करने के पुनः उपयोग कर लेता, तो यह गतिरोध नहीं होगा हालांकि थ्रेड की संख्या तय हो गई है:

new MyForkJoinTask().invoke(); 

तो तुम एक समस्या है, तो कि आप रिकर्सली को हल कर सकते हैं, ForkJoinPool का उपयोग करने के बारे में सोचें क्योंकि आप ForkJoinTask के रूप में आसानी से एक स्तर का रिकर्सन लागू कर सकते हैं।

बस अपने उदाहरणों में चल रहे धागे की संख्या की जांच करें।

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