जावा 8 में कितने स्ट्रीम्स को समानांतरस्ट्रीम में स्पॉन किया जाता है?


83

JDK8 में, जब मैं समानांतर स्ट्र्रीम का उपयोग कर रहा हूं तो कितने धागे पैदा होते हैं? उदाहरण के लिए, कोड में:

list.parallelStream().forEach(/** Do Something */);

यदि इस सूची में 100000 आइटम हैं, तो कितने धागे पैदा किए जाएंगे?

इसके अलावा, क्या प्रत्येक थ्रेड को काम करने के लिए समान संख्या में आइटम मिलते हैं या इसे बेतरतीब ढंग से आवंटित किया जाता है?



@assylias वास्तव में अच्छा जवाब।
उम्बर्टो रायमोंडी

जवाबों:


79

ओरेकल के कार्यान्वयन [1] समानांतर धारा के वर्तमान धागे का उपयोग करता है और इसके अलावा, यदि आवश्यक हो, तो डिफ़ॉल्ट थ्रेड को बनाने वाले थ्रेड भी शामिल होते हैं पूल ForkJoinPool.commonPool(), जो आपके सीपीयू के कोर की संख्या से कम एक डिफ़ॉल्ट आकार के बराबर है। ।

सामान्य पूल का डिफ़ॉल्ट आकार इस संपत्ति के साथ बदला जा सकता है:

-Djava.util.concurrent.ForkJoinPool.common.parallelism=8

वैकल्पिक रूप से, आप अपने स्वयं के पूल का उपयोग कर सकते हैं:

ForkJoinPool myPool = new ForkJoinPool(8);
myPool.submit(() ->
    list.parallelStream().forEach(/* Do Something */);
).get();

आदेश के संबंध में, नौकरियों को निष्पादित किया जाएगा जैसे ही कोई थ्रेड उपलब्ध होगा, कोई विशिष्ट क्रम में नहीं।

जैसा कि @Holger द्वारा सही ढंग से बताया गया है कि यह एक कार्यान्वयन विशिष्ट विवरण है ( दस्तावेज़ के नीचे केवल एक अस्पष्ट संदर्भ के साथ ), दोनों दृष्टिकोण ओरेकल की JVM पर काम करेंगे, लेकिन निश्चित रूप से अन्य विक्रेताओं से JVM पर काम करने की गारंटी नहीं है, संपत्ति हो सकती है गैर-ओरेकल कार्यान्वयन में मौजूद नहीं है और स्ट्रीम पूरी तरह से बेकार ForkJoinPoolके व्यवहार के आधार पर वैकल्पिक रूप से रेंडरिंग का उपयोग नहीं कर सकते हैं ForkJoinTask.fork( इस पर विवरण के लिए यहां देखें )।


5
शायद जोड़ने के लायक है कि यदि कार्यों की संख्या काफी कम है तो समानांतर धारा वास्तव में मुख्य धागे में चल सकती है।
अस्वच्छ

15
यह ध्यान दिया जाना चाहिए कि Streamएपीआई का उपयोग ForkJoinPoolकार्यान्वयन विवरण है। इस प्रकार, दोनों समाधान ओरेकल के वर्तमान कार्यान्वयन के साथ काम करते हैं लेकिन हर जगह काम करने की गारंटी नहीं है।
होल्गर

4

जबकि @uraimo सही है, इसका उत्तर वास्तव में "डू समथिंग" पर निर्भर करता है। समानांतर.स्ट्रीम एपीआई काउंटेड कॉमप्लेटर क्लास का उपयोग करता है जिसमें कुछ दिलचस्प समस्याएं हैं। चूंकि F / J फ्रेमवर्क परिणामों को धारण करने के लिए एक अलग ऑब्जेक्ट का उपयोग नहीं करता है, इसलिए लंबी श्रृंखला के परिणामस्वरूप OOME हो सकता है। इसके अलावा लंबी श्रृंखलाएं कभी-कभी स्टैक ओवरफ्लो का कारण बन सकती हैं। उन समस्याओं का उत्तर पैराक्वाशनल तकनीक का उपयोग है जैसा कि मैंने इस लेख में बताया है

नेस्टेड पैरेलल फॉरेक्स का उपयोग करते समय अन्य समस्या अत्यधिक थ्रेड निर्माण है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.