জাভা 8 সমান্তরাল স্ট্রিমের জন্য কাস্টম থ্রেড পুল নির্দিষ্ট করা সম্ভব ? আমি এটা কোথাও খুঁজে পাচ্ছি না.
কল্পনা করুন যে আমার একটি সার্ভার অ্যাপ্লিকেশন রয়েছে এবং আমি সমান্তরাল স্ট্রিমগুলি ব্যবহার করতে চাই। তবে অ্যাপ্লিকেশনটি বড় এবং একাধিক-থ্রেডযুক্ত তাই আমি এটিটি বিভাগ করতে চাই। আমি অন্য মডিউল থেকে অ্যাপ্লিকেশন কর্মের একটি মডিউলটিতে একটি ধীর চলমান কাজ চাই না।
যদি আমি বিভিন্ন মডিউলগুলির জন্য বিভিন্ন থ্রেড পুল ব্যবহার করতে না পারি তবে এর অর্থ আমি বিশ্বের বেশিরভাগ পরিস্থিতিতে নিরাপদে সমান্তরাল স্ট্রিম ব্যবহার করতে পারি না।
নিম্নলিখিত উদাহরণ চেষ্টা করুন। পৃথক থ্রেডে কিছু সিপিইউ নিবিড় কাজ সম্পাদিত হয়েছে। কাজগুলি সমান্তরাল স্ট্রিমগুলির উত্তোলন করে। প্রথম টাস্কটি নষ্ট হয়ে গেছে, তাই প্রতিটি পদক্ষেপে 1 সেকেন্ড লাগে (থ্রেড স্লিপ দ্বারা সিমুলেটেড)। সমস্যাটি হ'ল অন্যান্য থ্রেড আটকে যায় এবং ভাঙ্গা কাজ শেষ হওয়ার জন্য অপেক্ষা করে। এটি নিখুঁত উদাহরণ, তবে কোনও সার্লেট অ্যাপ এবং কল্পনা করুন যে কেউ ভাগ করে নেওয়া কাঁটাচামচ যোগদানের পুলটিতে দীর্ঘ কাজ চালাচ্ছেন ting
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);
}
}