Java Executor Framework

Java Technologies - জাভা কনকারেন্সি (Java Concurrency)
71
71

Java Executor Framework হলো একটি শক্তিশালী টুল যা সহজে এবং কার্যকরভাবে থ্রেড ম্যানেজমেন্ট এবং কনকারেন্ট টাস্কগুলি পরিচালনা করতে ব্যবহৃত হয়। এটি জাভার java.util.concurrent প্যাকেজে অন্তর্ভুক্ত।

Executor Framework কেন প্রয়োজন?

  1. থ্রেড ম্যানুয়াল ম্যানেজমেন্ট এড়ানো: থ্রেড তৈরি, চালানো, এবং জীবনচক্র পরিচালনার ঝামেলা দূর করা।
  2. থ্রেড পুল ব্যবহার: একাধিক টাস্ক সম্পাদনের জন্য থ্রেড পুনর্ব্যবহার করা।
  3. উচ্চ কার্যকারিতা: থ্রেড তৈরির ও ধ্বংসের ওভারহেড হ্রাস করে।
  4. সহজ টাস্ক পরিকল্পনা: টাস্ক শিডিউলিং এবং এক্সিকিউশনকে সহজ করে তোলে।

Executor Framework এর প্রধান ইন্টারফেস এবং ক্লাসসমূহ

  1. Executor: একটি সাধারণ ইন্টারফেস যা কাজ চালানোর জন্য ব্যবহৃত হয়।
  2. ExecutorService: Executor এর একটি উন্নত সংস্করণ, যা থ্রেড পুল পরিচালনার জন্য ব্যবহৃত হয়।
  3. ScheduledExecutorService: টাস্ক নির্দিষ্ট সময়ের ব্যবধানে চালানোর জন্য ব্যবহৃত হয়।
  4. ThreadPoolExecutor: কাস্টম থ্রেড পুল তৈরি করার জন্য একটি ফ্লেক্সিবল ক্লাস।
  5. ForkJoinPool: রিকার্সিভ টাস্ক পারফর্ম করার জন্য ব্যবহৃত হয়।

Executor Framework উদাহরণ

১. ExecutorService ব্যবহার

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3);

        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " is executing a task.");
        };

        // ৫টি টাস্ক সাবমিট করা
        for (int i = 0; i < 5; i++) {
            executor.submit(task);
        }

        executor.shutdown(); // Executor বন্ধ করা
    }
}

২. ScheduledExecutorService ব্যবহার

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(1);

        Runnable task = () -> {
            System.out.println("Task executed at: " + System.currentTimeMillis());
        };

        // প্রতি ২ সেকেন্ড অন্তর টাস্ক চালানো
        scheduler.scheduleAtFixedRate(task, 0, 2, TimeUnit.SECONDS);

        // ১০ সেকেন্ড পর Scheduler বন্ধ করা
        scheduler.schedule(() -> scheduler.shutdown(), 10, TimeUnit.SECONDS);
    }
}

৩. Callable এবং Future ব্যবহার

Callable ইন্টারফেস ব্যবহার করে টাস্ক থেকে একটি ফলাফল ফেরত পাওয়া সম্ভব।

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableFutureExample {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Callable<Integer> task = () -> {
            System.out.println("Performing a computation...");
            Thread.sleep(2000); // স্লিপ
            return 123; // ফলাফল ফেরত
        };

        Future<Integer> future = executor.submit(task);

        System.out.println("Task submitted. Waiting for result...");

        // Future থেকে ফলাফল পাওয়া
        Integer result = future.get();
        System.out.println("Result: " + result);

        executor.shutdown();
    }
}

৪. কাস্টম থ্রেড পুল তৈরি

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class CustomThreadPoolExample {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2, // Core pool size
                4, // Maximum pool size
                1, // Keep alive time
                TimeUnit.MINUTES,
                new LinkedBlockingQueue<>(2) // Task queue
        );

        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " is executing a task.");
        };

        for (int i = 0; i < 6; i++) {
            threadPool.execute(task);
        }

        threadPool.shutdown();
    }
}

ExecutorService ম্যানেজমেন্ট টিপস

১. Shutdown এবং ShutdownNow

  • shutdown(): থ্রেড পুলে আর নতুন টাস্ক নেওয়া হবে না। চলমান টাস্কগুলি শেষ হবে।
  • shutdownNow(): চলমান টাস্কগুলি বন্ধ করার চেষ্টা করে এবং টাস্কের কিউতে থাকা সব টাস্ক বাতিল করে।
executor.shutdown();
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
    executor.shutdownNow();
}

২. Await Termination

Executor বন্ধ হওয়ার পরে এটি শেষ হতে নির্দিষ্ট সময় পর্যন্ত অপেক্ষা করে।


Executor Framework এর ব্যবহারিক ক্ষেত্র

  1. বিপুল সংখ্যক টাস্ক ম্যানেজমেন্ট।
  2. শিডিউলড টাস্ক চালানো।
  3. রিকার্সিভ টাস্ক পরিচালনা (ForkJoinPool)।
  4. ডাটা প্রসেসিং বা লোড-ব্যালেন্সিং।

  • Executor Framework থ্রেড ব্যবস্থাপনার একটি শক্তিশালী সমাধান।
  • এটি থ্রেড পুনর্ব্যবহার, লোড ম্যানেজমেন্ট, এবং টাস্ক শিডিউলিংকে সহজ করে।
  • Callable, Future, এবং ScheduledExecutorService ব্যবহার করে আরও জটিল টাস্ক কার্যকরভাবে সম্পাদন করা সম্ভব।

আপনার প্রয়োজন অনুযায়ী Executor Framework এর সঠিক ক্লাস এবং পদ্ধতি নির্বাচন করুন।

Content added By

Executor Framework এর ধারণা

81
81

Executor Framework হল জাভার একটি শক্তিশালী টুল যা মাল্টি-থ্রেডেড প্রোগ্রামিং সহজ করে। এটি java.util.concurrent প্যাকেজে অন্তর্ভুক্ত এবং থ্রেড তৈরি, শিডিউলিং, এবং ব্যবস্থাপনার জন্য উন্নত API সরবরাহ করে। Executor Framework ম্যানুয়াল থ্রেড ম্যানেজমেন্টের তুলনায় আরও দক্ষ ও নির্ভরযোগ্য।


Executor Framework-এর ভূমিকা

মাল্টি-থ্রেডিং প্রোগ্রামে সরাসরি Thread ক্লাস ব্যবহার করে নতুন থ্রেড তৈরি করা জটিল হতে পারে। Executor Framework এ কাজের জন্য থ্রেড তৈরির পরিবর্তে একটি থ্রেড পুল ব্যবহার করা হয়, যা নিম্নলিখিত সুবিধা প্রদান করে:

  1. থ্রেড রিসাইক্লিং: বিদ্যমান থ্রেড পুনরায় ব্যবহার করে।
  2. পারফরম্যান্স বৃদ্ধি: থ্রেড তৈরির ও ব্যবস্থাপনার ওভারহেড কমায়।
  3. কনকারেন্সি নিয়ন্ত্রণ: কাজের শিডিউলিং এবং এক্সিকিউশন সহজ করে।
  4. স্কেলেবিলিটি: সিস্টেমের ক্ষমতা অনুযায়ী থ্রেড পুল ম্যানেজ করা যায়।

Executor Framework-এর মৌলিক গঠন

Executor Framework তিনটি মূল ইন্টারফেস নিয়ে গঠিত:

  1. Executor:
    • বেসিক ইন্টারফেস, যা execute() মেথড সরবরাহ করে।
    • উদাহরণ:

      Executor executor = Runnable::run;
      executor.execute(() -> System.out.println("Task executed"));
      
  2. ExecutorService:
    • Executor এর একটি সাবইন্টারফেস যা থ্রেড পুল পরিচালনার জন্য অতিরিক্ত সুবিধা দেয়। এটি submit() এবং shutdown() এর মতো মেথড প্রদান করে।
    • উদাহরণ:

      ExecutorService executorService = Executors.newFixedThreadPool(3);
      executorService.submit(() -> System.out.println("Task submitted"));
      executorService.shutdown();
      
  3. ScheduledExecutorService:
    • নির্দিষ্ট সময় বা সময়সূচি অনুযায়ী টাস্ক চালানোর জন্য ব্যবহৃত হয়।
    • উদাহরণ:

      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
      scheduler.schedule(() -> System.out.println("Task executed after delay"), 3, TimeUnit.SECONDS);
      scheduler.shutdown();
      

Executor Framework-এর ক্লাস এবং মেথড

Executor Framework ব্যবহার করার জন্য জাভা কিছু স্ট্যাটিক মেথড এবং ক্লাস সরবরাহ করে। এর মধ্যে উল্লেখযোগ্য:

  1. 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 ব্যবহারের সুবিধা

  1. সহজ থ্রেড ম্যানেজমেন্ট: নতুন থ্রেড তৈরির ঝামেলা দূর করে।
  2. দক্ষতা বৃদ্ধি: CPU এবং মেমরি ব্যবহারের দক্ষতা বাড়ায়।
  3. রিসোর্স ম্যানেজমেন্ট: থ্রেড পুলের আকার এবং টাইমআউট নির্ধারণ করার সুবিধা দেয়।
  4. সময়সূচি ব্যবস্থাপনা: নির্দিষ্ট সময় বা নির্দিষ্ট বিরতিতে কাজ চালানোর সুযোগ দেয়।

সেরা অনুশীলন

  1. shutdown() ব্যবহার করুন: Executor Service শেষ হওয়ার পরে এটি বন্ধ করুন।
  2. ঠিকঠাক থ্রেড পুল নির্বাচন করুন: অ্যাপ্লিকেশনের প্রয়োজন অনুসারে FixedThreadPool, CachedThreadPool বা ScheduledThreadPool ব্যবহার করুন।
  3. Exception Handling: থ্রেডের মধ্যে এক্সেপশন ম্যানেজ করুন।
  4. Overload এড়ান: থ্রেড পুলে অত্যধিক কাজ পাঠানোর আগে তার আকার সীমিত রাখুন।

Executor Framework মাল্টি-থ্রেডেড প্রোগ্রামিংয়ের জটিলতা অনেকাংশে দূর করে এবং স্কেলেবল এবং দক্ষ অ্যাপ্লিকেশন তৈরির জন্য একটি শক্তিশালী টুলসেট সরবরাহ করে। এটি জাভা প্রোগ্রামিংয়ে কনকারেন্সি সহজ ও আরও কার্যকর করে।

Content added By

Thread Pooling এর প্রয়োজনীয়তা

88
88

Thread Pooling কী?

Thread Pooling হলো একটি কনকারেন্সি মডেল যেখানে একাধিক থ্রেড একটি থ্রেড পুলে তৈরি এবং পুনরায় ব্যবহার করা হয়। নতুন থ্রেড তৈরি এবং ধ্বংস করার পরিবর্তে, থ্রেডগুলো পুনর্ব্যবহার করে কার্যক্ষমতা বৃদ্ধি করা হয়।

java.util.concurrent প্যাকেজের Executor Framework এই থ্রেড পুলিং মেকানিজমকে সহজতর এবং কার্যকর করেছে।


Thread Pooling কেন প্রয়োজন?

১. কাজের পারফরম্যান্স বৃদ্ধি:

  • প্রতিবার একটি নতুন থ্রেড তৈরি করা একটি ব্যয়বহুল প্রক্রিয়া।
  • থ্রেড পুলিং একই থ্রেডগুলো পুনর্ব্যবহার করে সিপিইউ এবং মেমোরির উপর চাপ কমায়।

২. সিস্টেম রিসোর্সের অপচয় রোধ:

  • অতিরিক্ত থ্রেড তৈরি হলে সিস্টেম রিসোর্সের অপচয় হয় এবং পারফরম্যান্সে নেতিবাচক প্রভাব পড়ে।
  • থ্রেড পুলিং থ্রেড সংখ্যা সীমাবদ্ধ করে এই সমস্যার সমাধান করে।

৩. থ্রেড ম্যানেজমেন্ট সহজতর করা:

  • থ্রেড পুল ব্যবহারের মাধ্যমে থ্রেড তৈরি, এক্সিকিউশন, এবং ধ্বংসের প্রক্রিয়া স্বয়ংক্রিয়ভাবে পরিচালিত হয়।

৪. Concurrency উন্নত করা:

  • থ্রেড পুলিং মাল্টি-থ্রেডেড অ্যাপ্লিকেশনে কনকারেন্সি হ্যান্ডলিং আরও কার্যকর করে।

৫. অ্যাপ্লিকেশন রেসপন্স টাইম কমানো:

  • নতুন থ্রেড তৈরির ওভারহেড এড়িয়ে অ্যাপ্লিকেশনের রেসপন্স টাইম দ্রুত হয়।

Thread Pooling কিভাবে কাজ করে?

  1. একটি Thread Pool প্রি-ডিফাইনড সংখ্যক থ্রেড তৈরি করে।
  2. কাজ (Task) জমা দেওয়া হলে থ্রেড পুল একটি থ্রেড নির্ধারণ করে কাজটি সম্পাদনের জন্য।
  3. কাজ সম্পন্ন হলে থ্রেডটি পুলে ফেরত যায় এবং পুনরায় ব্যবহারের জন্য প্রস্তুত হয়।

জাভাতে Thread Pooling এর উদাহরণ

১. ExecutorService ব্যবহার করে Thread Pool তৈরি:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolingExample {
    public static void main(String[] args) {
        // একটি Fixed Thread Pool তৈরি
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // Task তৈরি
        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " is executing the task.");
            try {
                Thread.sleep(1000); // কাজ সম্পন্ন করার জন্য সাময়িক বিরতি
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };

        // পুলে Task জমা দিন
        for (int i = 0; i < 10; i++) {
            executorService.execute(task);
        }

        // পুল বন্ধ করুন
        executorService.shutdown();
    }
}

আউটপুট (সম্ভাব্য):

pool-1-thread-1 is executing the task.
pool-1-thread-2 is executing the task.
pool-1-thread-3 is executing the task.
...

২. Cached Thread Pool ব্যবহার:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        // একটি Cached Thread Pool তৈরি
        ExecutorService executorService = Executors.newCachedThreadPool();

        // Task তৈরি
        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " is executing the task.");
        };

        // পুলে Task জমা দিন
        for (int i = 0; i < 5; i++) {
            executorService.execute(task);
        }

        // পুল বন্ধ করুন
        executorService.shutdown();
    }
}

Cached Thread Pool বৈশিষ্ট্য:

  • ডায়নামিকভাবে থ্রেড সংখ্যা সামঞ্জস্য করে।
  • কাজের চাপে থ্রেড সংখ্যা বাড়ায় এবং কাজ কম হলে থ্রেডগুলো ধ্বংস করে।

৩. Single Thread Executor:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        // একটি Single Thread Executor তৈরি
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // Task তৈরি
        Runnable task = () -> {
            System.out.println(Thread.currentThread().getName() + " is executing the task.");
        };

        // পুলে Task জমা দিন
        for (int i = 0; i < 3; i++) {
            executorService.execute(task);
        }

        // পুল বন্ধ করুন
        executorService.shutdown();
    }
}

Single Thread Executor বৈশিষ্ট্য:

  • একসাথে একটি মাত্র থ্রেড কাজ করে।
  • সিকোয়েন্সিয়াল টাস্ক এক্সিকিউশন নিশ্চিত করে।

Thread Pooling ব্যবহারের সেরা কৌশল

  1. পুল সাইজ সীমাবদ্ধ করুন:
    সিপিইউ কোর এবং মেমোরি অনুযায়ী থ্রেড সংখ্যা নির্ধারণ করুন।
  2. ব্যবহারকারী ইনপুটের উপর ভিত্তি করে থ্রেড সংখ্যা পরিবর্তন করবেন না:
    ব্যবহারকারীর ডাটা অনুযায়ী ডায়নামিক থ্রেড তৈরি করা ঝুঁকিপূর্ণ।
  3. Task Cancelling:
    টাস্ক বাতিল করার জন্য Future বা Callable ব্যবহার করুন।
  4. Exception Handling:
    থ্রেডের ব্যর্থতা বা এক্সেপশন হ্যান্ডল করার জন্য যথাযথ ব্যবস্থা নিন।

Thread Pooling এর সীমাবদ্ধতা

  1. Deadlock:
    থ্রেড পুল ব্যবহারে ডেডলক এড়াতে ভালো ডিজাইন প্রয়োজন।
  2. Resource Exhaustion:
    অতিরিক্ত কাজ জমা দিলে থ্রেড পুল ওভারলোড হতে পারে।
  3. Debugging এবং মনিটরিং চ্যালেঞ্জ:
    থ্রেড পুলের কার্যক্রম ডিবাগ এবং মনিটর করা জটিল হতে পারে।

Thread Pooling জাভা কনকারেন্সির একটি শক্তিশালী টুল যা অ্যাপ্লিকেশনের কার্যক্ষমতা বাড়াতে গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি সিস্টেম রিসোর্সের সঠিক ব্যবহার নিশ্চিত করে এবং থ্রেড ম্যানেজমেন্ট সহজতর করে। তবে, যথাযথ ডিজাইন এবং সীমাবদ্ধতা বিবেচনা করে এটি ব্যবহার করা উচিত।

Content added By

ExecutorService, ScheduledExecutorService এর ব্যবহার

85
85

FixedThreadPool এবং CachedThreadPool হল Java Concurrency এর ExecutorService ইন্টারফেসের দুটি গুরুত্বপূর্ণ থ্রেড পুল। এগুলো থ্রেড ম্যানেজমেন্ট আরও কার্যকর করতে ব্যবহৃত হয়।


১. FixedThreadPool

FixedThreadPool একটি নির্দিষ্ট সংখ্যক থ্রেড নিয়ে কাজ করে।

  • এটি আগে থেকে নির্ধারিত থ্রেড সংখ্যা পর্যন্ত কাজ করতে পারে।
  • নতুন টাস্ক এলে, বিদ্যমান থ্রেডগুলো ব্যস্ত থাকলে টাস্কগুলো একটি কিউতে অপেক্ষা করে।

উদাহরণ:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        // ১. FixedThreadPool তৈরি (3 থ্রেড)
        ExecutorService executor = Executors.newFixedThreadPool(3);

        for (int i = 1; i <= 10; i++) {
            final int taskId = i;
            executor.execute(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
                try {
                    Thread.sleep(2000); // প্রতিটি টাস্ক ২ সেকেন্ড সময় নেয়
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // ExecutorService বন্ধ করুন
        executor.shutdown();
    }
}

আউটপুট:

  • এক সময়ে সর্বোচ্চ ৩টি টাস্ক চলবে।
  • নতুন টাস্কগুলো কিউতে অপেক্ষা করবে, যতক্ষণ না বিদ্যমান থ্রেড ফ্রি হয়।

২. CachedThreadPool

CachedThreadPool এর থ্রেড সংখ্যা ডায়নামিক।

  • যখন একটি নতুন টাস্ক আসে, এটি বিদ্যমান থ্রেড ব্যবহার করে; যদি না থাকে, নতুন থ্রেড তৈরি করে।
  • অব্যবহৃত থ্রেডগুলো একটি নির্দিষ্ট সময় পরে ধ্বংস হয়ে যায় (ডিফল্ট: ৬০ সেকেন্ড)।

উদাহরণ:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        // ১. CachedThreadPool তৈরি
        ExecutorService executor = Executors.newCachedThreadPool();

        for (int i = 1; i <= 10; i++) {
            final int taskId = i;
            executor.execute(() -> {
                System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
                try {
                    Thread.sleep(2000); // প্রতিটি টাস্ক ২ সেকেন্ড সময় নেয়
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            });
        }

        // ExecutorService বন্ধ করুন
        executor.shutdown();
    }
}

আউটপুট:

  • একই সময়ে যত প্রয়োজন, তত থ্রেড তৈরি হবে।
  • কম টাস্ক থাকলে বিদ্যমান থ্রেড পুনরায় ব্যবহার হবে।

FixedThreadPool এবং CachedThreadPool এর তুলনা

প্যারামিটারFixedThreadPoolCachedThreadPool
থ্রেড সংখ্যানির্দিষ্ট (Fixed)ডায়নামিক (প্রয়োজন অনুযায়ী তৈরি এবং ধ্বংস)
কর্মক্ষমতা (Performance)কম টাস্ক থাকলে দ্রুত এবং নিয়ন্ত্রিতবেশি টাস্কে দ্রুত (প্রচুর থ্রেড তৈরি হতে পারে)
রিসোর্স ব্যবহারে নিয়ন্ত্রণথ্রেড সংখ্যা নিয়ন্ত্রিতরিসোর্স বেশি ব্যবহৃত হতে পারে
ব্যবহার ক্ষেত্রসীমিত এবং পূর্ব নির্ধারিত টাস্কডায়নামিক এবং অপ্রত্যাশিত টাস্ক

  • FixedThreadPool ব্যবহার করুন, যদি থ্রেড সংখ্যা পূর্বনির্ধারিত থাকে এবং সিস্টেম রিসোর্স নিয়ন্ত্রণে রাখতে চান।
  • CachedThreadPool ব্যবহার করুন, যদি টাস্ক সংখ্যা ডায়নামিক হয় এবং দ্রুত থ্রেড তৈরি করার প্রয়োজন হয়।

এই উদাহরণগুলো দেখে আপনি FixedThreadPool এবং CachedThreadPool এর কাজ এবং তাদের মধ্যে পার্থক্য বুঝতে পারবেন।

Content added By

FixedThreadPool এবং CachedThreadPool এর উদাহরণ

128
128

Callable এবং Future ইন্টারফেস জাভাতে মাল্টি-থ্রেডিংয়ের জন্য ব্যবহৃত হয় এবং সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস টাস্ক সম্পাদনে সাহায্য করে। এদের সাহায্যে থ্রেড থেকে ডেটা ফেরত পাওয়া এবং থ্রেডের এক্সিকিউশন স্টেট পরিচালনা করা সম্ভব।


Callable Interface

Callable কি?

  • Callable হলো জাভার java.util.concurrent প্যাকেজের একটি ইন্টারফেস যা একটি রিটার্ন ভ্যালু এবং এক্সসেপশন থ্রো করার ক্ষমতা প্রদান করে।
  • এটি Runnable এর বিকল্প যা কোনো রিটার্ন ভ্যালু দেয় না।

Callable ব্যবহার করার পদ্ধতি

  • Callable ইন্টারফেস একটি জেনেরিক টাইপ গ্রহণ করে যা তার রিটার্ন ভ্যালুর টাইপ নির্ধারণ করে।
  • এটি call() মেথড ব্যবহার করে কাজ করে।
import java.util.concurrent.Callable;

class MyCallableTask implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        System.out.println("Callable Task Executing...");
        return 42; // রিটার্ন ভ্যালু
    }
}

Future Interface

Future কি?

  • Future হলো একটি ইন্টারফেস যা অ্যাসিঙ্ক্রোনাস টাস্কের স্টেট পরিচালনা করে।
  • এটি ব্যবহার করে আপনি:
    • টাস্ক শেষ হয়েছে কিনা তা চেক করতে পারেন।
    • রিটার্ন ভ্যালু পেতে পারেন।
    • টাস্ক বাতিল করতে পারেন।

Future এর গুরুত্বপূর্ণ মেথড

  1. get(): টাস্ক শেষ হলে রিটার্ন ভ্যালু প্রদান করে। এটি ব্লকিং।
  2. isDone(): টাস্ক শেষ হয়েছে কিনা তা জানায়।
  3. isCancelled(): টাস্ক বাতিল হয়েছে কিনা তা জানায়।
  4. cancel(boolean mayInterruptIfRunning): টাস্ক বাতিল করে।

Callable এবং Future এর ব্যবহার: উদাহরণ

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableFutureExample {
    public static void main(String[] args) {
        // ১. ExecutorService তৈরি করুন
        ExecutorService executor = Executors.newSingleThreadExecutor();

        // ২. Callable টাস্ক তৈরি করুন
        Callable<Integer> task = () -> {
            System.out.println("Callable Task Executing...");
            Thread.sleep(2000); // কিছু সময় অপেক্ষা
            return 42; // রিটার্ন ভ্যালু
        };

        // ৩. Future ব্যবহার করে টাস্ক জমা দিন
        Future<Integer> future = executor.submit(task);

        // ৪. টাস্কের স্টেট চেক করুন
        System.out.println("Task Submitted. Waiting for result...");

        try {
            // রিটার্ন ভ্যালু পান
            Integer result = future.get(); // ব্লকিং মেথড
            System.out.println("Result from Callable: " + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // ৫. Executor বন্ধ করুন
        executor.shutdown();
    }
}

আউটপুট:

Callable Task Executing...
Task Submitted. Waiting for result...
Result from Callable: 42

Future এর ক্যানসেলেশন এবং স্টেট চেক

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class FutureCancelExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();

        Callable<String> task = () -> {
            Thread.sleep(5000); // ৫ সেকেন্ডের জন্য স্লিপ
            return "Task Completed!";
        };

        Future<String> future = executor.submit(task);

        try {
            // টাস্ক বাতিল করার আগে কিছুক্ষণ অপেক্ষা করুন
            Thread.sleep(2000);
            System.out.println("Cancelling the task...");
            future.cancel(true); // টাস্ক বাতিল

            // টাস্ক স্টেট চেক করুন
            if (future.isCancelled()) {
                System.out.println("Task was cancelled.");
            } else {
                System.out.println("Result: " + future.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }
}

আউটপুট:

Cancelling the task...
Task was cancelled.

Callable এবং Future: সুবিধা ও অসুবিধা

সুবিধা:

  1. রিটার্ন ভ্যালু: Callable ইন্টারফেস রিটার্ন ভ্যালু এবং এক্সসেপশন হ্যান্ডলিং সক্ষম করে।
  2. অ্যাসিঙ্ক্রোনাস প্রসেসিং: Future ইন্টারফেস অ্যাসিঙ্ক্রোনাস টাস্কের স্টেট পরিচালনা সহজ করে।
  3. কাস্টমাইজড থ্রেড ম্যানেজমেন্ট: ExecutorService ব্যবহার করে পুল ম্যানেজমেন্ট সম্ভব।

অসুবিধা:

  1. ব্লকিং: get() মেথড ব্লকিং, যা কার্যক্ষমতা হ্রাস করতে পারে।
  2. কমপ্লেক্সিটি: বড় স্কেলের অ্যাপ্লিকেশনগুলিতে সঠিকভাবে হ্যান্ডেল করা কঠিন।

FutureTask: Callable এবং Future এর সমন্বয়

FutureTask হলো Callable এবং Future এর একটি ইমপ্লিমেন্টেশন। এটি সরাসরি ব্যবহার করা যায়।

import java.util.concurrent.FutureTask;

public class FutureTaskExample {
    public static void main(String[] args) {
        // FutureTask তৈরি
        FutureTask<Integer> futureTask = new FutureTask<>(() -> {
            Thread.sleep(3000);
            return 100;
        });

        // FutureTask রান করান
        Thread thread = new Thread(futureTask);
        thread.start();

        try {
            System.out.println("Waiting for result...");
            System.out.println("Result: " + futureTask.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Waiting for result...
Result: 100

  • Callable: রিটার্ন ভ্যালু সহ টাস্ক পরিচালনা করতে।
  • Future: অ্যাসিঙ্ক্রোনাস টাস্কের স্টেট এবং রেজাল্ট পরিচালনা করতে।
  • FutureTask: Callable এবং Future এর সমন্বিত ব্যবহারের জন্য।

এই টুলগুলো ব্যবহার করে জাভাতে মাল্টি-থ্রেডিংয়ের কার্যকারিতা এবং নমনীয়তা বাড়ানো যায়।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion