2017-04-06 5 views
6

यह मानते हुए कि मैं समानांतरवाद n की डिग्री के साथ एक ForkJoinPool सेटअप है, और है कि मैं इस तरह एक समानांतर गणना फोन:ForkJoinPool और Future.Get

workpool.submit(
      () -> { 
        objects.values().parallelStream().forEach(obj -> { 
         obj.foo(); 
        }); 
       }); 

मैं यह करने के लिए सुनिश्चित करें कि धागे पैदा वहाँ बनाई गई हैं वर्कपूल के अंदर (मेरे पास सिस्टम के अलग-अलग घटक हैं जिन्हें पृथक करने की आवश्यकता है)। अब लगता है कि धागा है जिसमें यह कहा जाता है, भी इस workpool अंदर निष्पादित हो रहा है, और मुझे क्या करना:

Future<?> wait = workpool.submit(
      () -> { 
        objects.values().parallelStream().forEach(obj -> { 
         obj.foo(); 
        }); 
       }); 
wait.get() 

1) मैं ForkJoinPool में एक धागा अवरुद्ध रहा हूं? अगर मुझे वर्कपूल में कोई कार्य निर्धारित करने की कोशिश करते समय, वायदा पर सभी ब्लॉक को थ्रेड करना था, तो क्या इससे डेडलॉक हो जाएगा? यह मुझे स्पष्ट नहीं है कि फोर्कजॉइनपूल में "समांतरता की अधिकतम डिग्री" का अर्थ है कि (यदि गैर गैर-अवरुद्ध कार्य हैं), तो हमेशा एन धागे निष्पादित होंगे, या चाहे निश्चित संख्या में धागे हों, भले ही अवरुद्ध हैं। क्या होगा यदि मैं wait.join() के बजाय wait.join का उपयोग करता हूं (मुझे चेक अपवादों की आवश्यकता नहीं है क्योंकि इस कोड में फेंक दिया गया कोई भी अपवाद पहले ही रनटाइसेप्शन उत्पन्न करेगा। अगर मैं सही ढंग से समझता हूं, तो शामिल हों() थ्रेड को प्रतीक्षा करते समय कतारबद्ध कार्यों को निष्पादित करने की अनुमति देगा)

2) हूँ मैं अभी भी समानांतर धारा के कार्यों forkjoin हल्के वजन के लाभ के लिए हो रही कर() द्वारा अगर मैं एक runnable "आवरण" वर्ग बनाने हूँ -> {}

3) है वहाँ किसी भी इसके बजाय इसका उपयोग करने के लिए नकारात्मक/उल्टा (यह मानते हुए कि .join() वास्तव में कार्य-चोरी व्यवहार को लागू करता है जो मुझे लगता है कि यह करता है):

 CompletableFuture.supplyAsync(this::mylambdafunction, workpool) 
      .thenAccept(this::mynextfunction); 

उत्तर

1

बिंदु 1: पर प्रतिक्रिया यह जानना मुश्किल है कि आपका कोड वास्तविक विधि कार्यान्वयन को देखे बिना ब्लॉक करेगा या नहीं। ब्लॉकिंग कोड से निपटने का एक दृष्टिकोण फोर्कजोइन थ्रेडपूल में धागे की संख्या में वृद्धि करना है। आम तौर पर, फोर्कजोइन थ्रेड में धागे की संख्या गणना गहन कार्यों के लिए एन + 1 है जहां n = प्रोसेसर की संख्या। या यदि आपके पास I/O अवरुद्ध है तो आप एक प्रबंधित ब्लॉकर का उपयोग कर सकते हैं।

रिस्पांस 2 बात करने के लिए: बिंदु 3 के लिए हाँ

प्रतिक्रिया: अपने completableFuture कोड के लिए स्पष्ट उल्टा कि thenAccept गैर अवरुद्ध है। तो नियंत्रण तुरंत आपके कॉम्प्लेटेबल फ्यूचर ब्लॉक को बिना किसी प्रतीक्षा के अगले कथन में ले जाएगा, जबकि पहले कोड में आपने फोर्कजॉइन पूल के साथ लिखा था, wait.get() तब तक अवरुद्ध होगा जब तक आप कोई जवाब प्राप्त नहीं करेंगे और तब तक आगे नहीं बढ़ेंगे।

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