একটি মাল্টি-থ্রেডেড অ্যাপ্লিকেশন বিকাশ করার সময়, আমাদের সাধারণত থ্রেডের কাজ সংগঠিত করার সাথে মোকাবিলা করতে হবে। আমাদের অ্যাপ্লিকেশন যত বড় হবে এবং মাল্টিথ্রেডেড কাজের জন্য আমাদের যত বেশি থ্রেড প্রয়োজন হবে, তত বেশিচলমানআমরা যে বস্তু তৈরি করি।

এখানে উল্লেখ্য যে জাভাতে একটি থ্রেড তৈরি করা একটি বরং ব্যয়বহুল অপারেশন। যদি আমরা প্রতিবার একটি অপারেশন করার জন্য থ্রেডের একটি নতুন উদাহরণ তৈরি করি, আমরা কর্মক্ষমতা এবং ফলস্বরূপ, অ্যাপ্লিকেশনের স্বাস্থ্যের সাথে বড় সমস্যা পাব।

একটি থ্রেড পুল এবং ThreadPoolExecutor এখানে আমাদের সাহায্যে আসে।

একটি থ্রেড পুল হল প্রাক-প্রাথমিক থ্রেডের একটি সেট। এর আকার স্থির বা পরিবর্তনশীল হতে পারে।

যদি থ্রেডের চেয়ে বেশি কাজ থাকে, তাহলে কাজগুলি একটি টাস্ক সারিতে অপেক্ষা করে। পুলের Nth থ্রেডটি সারি থেকে একটি টাস্ক নেয় এবং এটি সম্পন্ন হওয়ার পরে, থ্রেডটি সারি থেকে একটি নতুন কাজ গ্রহণ করে। সারিতে থাকা সমস্ত কাজ শেষ হয়ে গেলে, থ্রেডগুলি সক্রিয় থাকে এবং নতুন কাজের জন্য অপেক্ষা করে। যখন নতুন কাজগুলি উপস্থিত হয়, থ্রেডগুলিও সেগুলি কার্যকর করা শুরু করে।

থ্রেডপুল এক্সিকিউটর

জাভা 5 দিয়ে শুরু করে, এক্সিকিউটর ফ্রেমওয়ার্ক একটি মাল্টিথ্রেডিং সমাধান পেয়েছে। সাধারণভাবে, এতে প্রচুর উপাদান রয়েছে এবং এর উদ্দেশ্য হল সারি এবং থ্রেড পুলগুলিকে দক্ষভাবে পরিচালনা করতে আমাদের সাহায্য করা।

প্রধান ইন্টারফেস হল এক্সিকিউটর এবং এক্সিকিউটর সার্ভিস

এক্সিকিউটর হল একটি ইন্টারফেস যার একটি একক অকার্যকর এক্সিকিউট (রাননেবল রানেবল) পদ্ধতি।

এই পদ্ধতির বাস্তবায়নে একটি কাজ পাস করার সময়, জেনে রাখুন যে এটি ভবিষ্যতে অ্যাসিঙ্ক্রোনাসভাবে কার্যকর করা হবে।

ExecutorService — একটি ইন্টারফেস যা এক্সিকিউটর ইন্টারফেসকে প্রসারিত করে, কার্য সম্পাদনের জন্য ক্ষমতা যোগ করে। এটিতে চলমান টাস্কে বাধা দেওয়ার এবং থ্রেড পুলটি বন্ধ করার পদ্ধতি রয়েছে।

ThreadPoolExecutor এক্সিকিউটর এবং এক্সিকিউটরসার্ভিস ইন্টারফেস প্রয়োগ করেএবং টাস্ক এক্সিকিউশন থেকে টাস্ক তৈরিকে আলাদা করে। আমাদের রানেবল অবজেক্টগুলি বাস্তবায়ন করতে হবেএবং সেগুলিকে একজন নির্বাহকের কাছে পাঠাতে হবে। ThreadPoolExecutorতারপর কাজগুলি সম্পাদন করার জন্য এবং থ্রেড তৈরি এবং কাজ করার জন্য দায়ী

একটি কার্য সম্পাদনের জন্য পাঠানোর পরে, পুলের একটি বিদ্যমান থ্রেড ব্যবহার করা হয়। এই কর্মক্ষমতা উন্নত. এটি একটি নতুন থ্রেড তৈরি এবং শুরু করার জন্য সম্পদ নষ্ট করার সমস্যা সমাধান করে, এবং তারপরে আবার আবর্জনা সংগ্রহের উপর একবার আমরা থ্রেডটি শেষ করে ফেলি।

ThreadPoolExecutor এর 4 কনস্ট্রাক্টর আছে:


ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
    

ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime, 
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)
    

ThreadPoolExecutor কনস্ট্রাক্টরের নিম্নলিখিত পরামিতি রয়েছে :

কোরপুল সাইজ এই প্যারামিটারটি নির্দেশ করে যে নির্বাহক পরিষেবা শুরু হলে কতগুলি থ্রেড প্রস্তুত (শুরু) হবে।
সর্বোচ্চ পুল সাইজ একটি নির্বাহক পরিষেবা তৈরি করতে পারে এমন সর্বাধিক সংখ্যক থ্রেড৷
KeepAliveTime থ্রেডের সংখ্যা বেশি হলে একটি মুক্ত থ্রেড ধ্বংস হওয়ার আগে বেঁচে থাকতে থাকবেকোরপুল সাইজ. সময়ের একক পরবর্তী প্যারামিটারে নির্দিষ্ট করা হয়েছে।
ইউনিট সময়ের একক (ঘন্টা, মিনিট, সেকেন্ড, মিলিসেকেন্ড, ইত্যাদি)।
কাজের সারি কাজের জন্য একটি সারি বাস্তবায়ন।
হ্যান্ডলার যে কাজগুলি সম্পূর্ণ করা যায় না তার জন্য হ্যান্ডলার।
থ্রেড ফ্যাক্টরি একটি বস্তু যা চাহিদা অনুযায়ী নতুন থ্রেড তৈরি করে। থ্রেড ফ্যাক্টরি ব্যবহার করে একটি নতুন থ্রেড হার্ডওয়্যারে কল করা হয়, যা অ্যাপ্লিকেশনগুলিকে বিশেষ থ্রেড সাবক্লাস, অগ্রাধিকার ইত্যাদি ব্যবহার করতে দেয়।

একটি ThreadPoolExecutor তৈরি করা হচ্ছে

এক্সিকিউটর ইউটিলিটি ক্লাস একটি ThreadPoolExecutor তৈরিকে সহজ করতে পারে । এই ইউটিলিটি ক্লাসের পদ্ধতিগুলি আমাদের একটি প্রস্তুত করতে সাহায্য করেথ্রেডপুল এক্সিকিউটরবস্তু

newFixedThreadPool — একটি থ্রেড পুল তৈরি করে যা যেকোন সংখ্যক কাজ চালানোর জন্য নির্দিষ্ট সংখ্যক থ্রেড পুনরায় ব্যবহার করে।

ExecutorService executor = Executors.newFixedThreadPool(10);
                    
newWorkStealingPool — একটি থ্রেড পুল তৈরি করে যেখানে থ্রেডের সংখ্যা JVM-তে উপলব্ধ প্রসেসর কোরের সংখ্যার সমান। ডিফল্ট একত্রীকরণ স্তর এক. এর মানে হল যে পুলে যতগুলি থ্রেড তৈরি করা হবে ততগুলি সিপিইউ কোর জেভিএম-এ উপলব্ধ। যদি কনকারেন্সি লেভেল 4 হয়, তাহলে কোরের সংখ্যার পরিবর্তে পাস করা মান ব্যবহার করা হয়।

ExecutorService executor = Executors.newWorkStealingPool(4);
                    
newSingleThreadExecutor — সমস্ত কাজ চালানোর জন্য একটি একক থ্রেড দিয়ে একটি পুল তৈরি করে।

ExecutorService executor = Executors.newSingleThreadExecutor();
                    
newCachedThreadPool — একটি থ্রেড পুল তৈরি করে যা প্রয়োজন অনুসারে নতুন থ্রেড তৈরি করে, কিন্তু পূর্বে তৈরি থ্রেডগুলি উপলব্ধ হলে পুনরায় ব্যবহার করে।

ExecutorService executor = Executors.newCachedThreadPool();
                    
newScheduledThreadPool — একটি থ্রেড পুল তৈরি করে যা প্রদত্ত বিলম্বের পরে বা পর্যায়ক্রমে কার্যকর করার জন্য কমান্ড নির্ধারণ করতে পারে।

ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
                    

আমরা নিম্নলিখিত পাঠে প্রতিটি ধরণের পুল বিবেচনা করব।