यह मानते हुए कि मैं समानांतरवाद 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);