Executor Framework হল জাভার একটি শক্তিশালী টুল যা মাল্টি-থ্রেডেড প্রোগ্রামিং সহজ করে। এটি java.util.concurrent প্যাকেজে অন্তর্ভুক্ত এবং থ্রেড তৈরি, শিডিউলিং, এবং ব্যবস্থাপনার জন্য উন্নত API সরবরাহ করে। Executor Framework ম্যানুয়াল থ্রেড ম্যানেজমেন্টের তুলনায় আরও দক্ষ ও নির্ভরযোগ্য।
Executor Framework-এর ভূমিকা
মাল্টি-থ্রেডিং প্রোগ্রামে সরাসরি Thread ক্লাস ব্যবহার করে নতুন থ্রেড তৈরি করা জটিল হতে পারে। Executor Framework এ কাজের জন্য থ্রেড তৈরির পরিবর্তে একটি থ্রেড পুল ব্যবহার করা হয়, যা নিম্নলিখিত সুবিধা প্রদান করে:
- থ্রেড রিসাইক্লিং: বিদ্যমান থ্রেড পুনরায় ব্যবহার করে।
- পারফরম্যান্স বৃদ্ধি: থ্রেড তৈরির ও ব্যবস্থাপনার ওভারহেড কমায়।
- কনকারেন্সি নিয়ন্ত্রণ: কাজের শিডিউলিং এবং এক্সিকিউশন সহজ করে।
- স্কেলেবিলিটি: সিস্টেমের ক্ষমতা অনুযায়ী থ্রেড পুল ম্যানেজ করা যায়।
Executor Framework-এর মৌলিক গঠন
Executor Framework তিনটি মূল ইন্টারফেস নিয়ে গঠিত:
- Executor:
- বেসিক ইন্টারফেস, যা
execute()মেথড সরবরাহ করে। উদাহরণ:
Executor executor = Runnable::run; executor.execute(() -> System.out.println("Task executed"));
- বেসিক ইন্টারফেস, যা
- ExecutorService:
- Executor এর একটি সাবইন্টারফেস যা থ্রেড পুল পরিচালনার জন্য অতিরিক্ত সুবিধা দেয়। এটি
submit()এবংshutdown()এর মতো মেথড প্রদান করে। উদাহরণ:
ExecutorService executorService = Executors.newFixedThreadPool(3); executorService.submit(() -> System.out.println("Task submitted")); executorService.shutdown();
- Executor এর একটি সাবইন্টারফেস যা থ্রেড পুল পরিচালনার জন্য অতিরিক্ত সুবিধা দেয়। এটি
- ScheduledExecutorService:
- নির্দিষ্ট সময় বা সময়সূচি অনুযায়ী টাস্ক চালানোর জন্য ব্যবহৃত হয়।
উদাহরণ:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2); scheduler.schedule(() -> System.out.println("Task executed after delay"), 3, TimeUnit.SECONDS); scheduler.shutdown();
Executor Framework-এর ক্লাস এবং মেথড
Executor Framework ব্যবহার করার জন্য জাভা কিছু স্ট্যাটিক মেথড এবং ক্লাস সরবরাহ করে। এর মধ্যে উল্লেখযোগ্য:
- Executors Class:
- থ্রেড পুল তৈরি করতে সাহায্য করে।
- প্রধান মেথড:
newFixedThreadPool(int nThreads): একটি নির্দিষ্ট সংখ্যা থ্রেড পুল তৈরি করে।newCachedThreadPool(): একটি ডায়নামিক থ্রেড পুল তৈরি করে।newSingleThreadExecutor(): একক থ্রেডের পুল তৈরি করে।newScheduledThreadPool(int corePoolSize): সময়সূচি অনুযায়ী টাস্ক পরিচালনা করে।
Executor Framework-এর উদাহরণ
১. Fixed Thread Pool ব্যবহার করে Executor Service
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FixedThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 5; i++) {
int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " is running on thread: " + Thread.currentThread().getName());
});
}
executor.shutdown();
}
}
আউটপুট (সম্ভাব্য):
Task 1 is running on thread: pool-1-thread-1
Task 2 is running on thread: pool-1-thread-2
Task 3 is running on thread: pool-1-thread-3
Task 4 is running on thread: pool-1-thread-1
Task 5 is running on thread: pool-1-thread-2
২. Cached Thread Pool উদাহরণ
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CachedThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 1; i <= 5; i++) {
int taskId = i;
executor.submit(() -> {
System.out.println("Task " + taskId + " is running on thread: " + Thread.currentThread().getName());
});
}
executor.shutdown();
}
}
৩. Scheduled Executor Service উদাহরণ
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorExample {
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.schedule(() -> System.out.println("Task executed after 5 seconds"), 5, TimeUnit.SECONDS);
scheduler.scheduleAtFixedRate(() -> System.out.println("Periodic Task"), 1, 3, TimeUnit.SECONDS);
scheduler.scheduleWithFixedDelay(() -> System.out.println("Task with delay"), 1, 2, TimeUnit.SECONDS);
try {
Thread.sleep(10000); // Wait for 10 seconds to observe tasks
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.shutdown();
}
}
Executor Framework ব্যবহারের সুবিধা
- সহজ থ্রেড ম্যানেজমেন্ট: নতুন থ্রেড তৈরির ঝামেলা দূর করে।
- দক্ষতা বৃদ্ধি: CPU এবং মেমরি ব্যবহারের দক্ষতা বাড়ায়।
- রিসোর্স ম্যানেজমেন্ট: থ্রেড পুলের আকার এবং টাইমআউট নির্ধারণ করার সুবিধা দেয়।
- সময়সূচি ব্যবস্থাপনা: নির্দিষ্ট সময় বা নির্দিষ্ট বিরতিতে কাজ চালানোর সুযোগ দেয়।
সেরা অনুশীলন
shutdown()ব্যবহার করুন: Executor Service শেষ হওয়ার পরে এটি বন্ধ করুন।- ঠিকঠাক থ্রেড পুল নির্বাচন করুন: অ্যাপ্লিকেশনের প্রয়োজন অনুসারে
FixedThreadPool,CachedThreadPoolবাScheduledThreadPoolব্যবহার করুন। - Exception Handling: থ্রেডের মধ্যে এক্সেপশন ম্যানেজ করুন।
- Overload এড়ান: থ্রেড পুলে অত্যধিক কাজ পাঠানোর আগে তার আকার সীমিত রাখুন।
Executor Framework মাল্টি-থ্রেডেড প্রোগ্রামিংয়ের জটিলতা অনেকাংশে দূর করে এবং স্কেলেবল এবং দক্ষ অ্যাপ্লিকেশন তৈরির জন্য একটি শক্তিশালী টুলসেট সরবরাহ করে। এটি জাভা প্রোগ্রামিংয়ে কনকারেন্সি সহজ ও আরও কার্যকর করে।
Read more