क्या जावा 8 समानांतर धारा के लिए एक कस्टम थ्रेड पूल निर्दिष्ट करना संभव है ? मैं इसे कहीं भी नहीं ढूंढ सकता।
कल्पना कीजिए कि मेरे पास एक सर्वर अनुप्रयोग है और मैं समानांतर धाराओं का उपयोग करना चाहूंगा। लेकिन आवेदन बड़ा और बहु-थ्रेडेड है इसलिए मैं इसे कंपार्टमेंट करना चाहता हूं। मैं किसी अन्य मॉड्यूल से एप्लिकेशनब्लॉक कार्यों के एक मॉड्यूल में धीमी गति से चलने वाला कार्य नहीं चाहता हूं।
अगर मैं अलग-अलग मॉड्यूल के लिए अलग-अलग थ्रेड पूल का उपयोग नहीं कर सकता हूं, तो इसका मतलब है कि मैं वास्तविक दुनिया की अधिकांश स्थितियों में समानांतर धाराओं का सुरक्षित रूप से उपयोग नहीं कर सकता हूं।
निम्न उदाहरण का प्रयास करें। अलग-अलग थ्रेड्स में निष्पादित कुछ सीपीयू गहन कार्य हैं। कार्य समानांतर धाराओं का लाभ उठाते हैं। पहला कार्य टूट गया है, इसलिए प्रत्येक चरण में 1 सेकंड लगता है (थ्रेड स्लीप द्वारा सिम्युलेटेड)। मुद्दा यह है कि अन्य धागे फंस जाते हैं और टूटे हुए कार्य के समाप्त होने की प्रतीक्षा करते हैं। यह आकस्मिक उदाहरण है, लेकिन एक सर्वलेट ऐप की कल्पना करें और कोई व्यक्ति साझा कांटे में शामिल होने के लिए एक लंबे समय तक चलने वाला कार्य प्रस्तुत करता है।
public class ParallelTest {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(() -> runTask(1000)); //incorrect task
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.execute(() -> runTask(0));
es.shutdown();
es.awaitTermination(60, TimeUnit.SECONDS);
}
private static void runTask(int delay) {
range(1, 1_000_000).parallel().filter(ParallelTest::isPrime).peek(i -> Utils.sleep(delay)).max()
.ifPresent(max -> System.out.println(Thread.currentThread() + " " + max));
}
public static boolean isPrime(long n) {
return n > 1 && rangeClosed(2, (long) sqrt(n)).noneMatch(divisor -> n % divisor == 0);
}
}