DelayQueue এবং PriorityBlockingQueue এর উদাহরণ

Concurrency Utilities (java.util.concurrent) - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

330

DelayQueue এবং PriorityBlockingQueue হল জাভার কনকারেন্সি ফ্রেমওয়ার্কে ব্যবহৃত বিশেষধরনের BlockingQueue। এদের ভূমিকা এবং ব্যবহারের উপায় নিচে বিস্তারিতভাবে ব্যাখ্যা করা হলো।


DelayQueue

DelayQueue হলো একটি ব্লকিং কিউ, যা এমন ডেটা সংরক্ষণ করে যেগুলো নির্দিষ্ট সময় পর অ্যাক্সেসযোগ্য হয়। এটি Delayed ইন্টারফেস ব্যবহার করে কাজ করে।

বৈশিষ্ট্য:

  1. Time-based delay: প্রতিটি আইটেম নির্দিষ্ট সময়ের জন্য কিউতে থাকবে।
  2. থ্রেড-সেফ: একাধিক থ্রেড একযোগে কিউ থেকে উপাদান পড়তে বা যোগ করতে পারে।
  3. Delayed ইন্টারফেস: কিউর উপাদানগুলোতে getDelay() মেথড প্রয়োগ করতে হয়।

DelayQueue উদাহরণ

একটি মেসেজ ডেলিভারি সিস্টেম যেখানে মেসেজ নির্দিষ্ট সময়ে ডেলিভার হবে।

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

// Delayed ইন্টারফেস ইমপ্লিমেন্ট করা ক্লাস
class DelayedMessage implements Delayed {
    private final String message;
    private final long startTime;

    public DelayedMessage(String message, long delayInMillis) {
        this.message = message;
        this.startTime = System.currentTimeMillis() + delayInMillis;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        long remainingTime = startTime - System.currentTimeMillis();
        return unit.convert(remainingTime, TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        if (this.startTime < ((DelayedMessage) o).startTime) {
            return -1;
        }
        if (this.startTime > ((DelayedMessage) o).startTime) {
            return 1;
        }
        return 0;
    }

    @Override
    public String toString() {
        return "Message: " + message + ", Start Time: " + startTime;
    }
}

public class DelayQueueExample {
    public static void main(String[] args) throws InterruptedException {
        DelayQueue<DelayedMessage> delayQueue = new DelayQueue<>();

        // মেসেজ যোগ করা
        delayQueue.put(new DelayedMessage("Message 1", 3000)); // ৩ সেকেন্ড বিলম্ব
        delayQueue.put(new DelayedMessage("Message 2", 5000)); // ৫ সেকেন্ড বিলম্ব

        System.out.println("Messages are being processed...");

        // মেসেজ প্রসেস করা
        while (!delayQueue.isEmpty()) {
            DelayedMessage message = delayQueue.take(); // ব্লকিং কল
            System.out.println("Processed: " + message);
        }

        System.out.println("All messages processed.");
    }
}

আউটপুট:

  1. প্রথম মেসেজ ৩ সেকেন্ড পরে প্রসেস হবে।
  2. দ্বিতীয় মেসেজ ৫ সেকেন্ড পরে প্রসেস হবে।

PriorityBlockingQueue

PriorityBlockingQueue হলো একটি ব্লকিং কিউ যা PriorityQueue এর থ্রেড-সেফ সংস্করণ। এটি উপাদানগুলোকে প্রাক-সংজ্ঞায়িত natural order বা কাস্টম কম্পারেটর অনুযায়ী সাজিয়ে রাখে।

বৈশিষ্ট্য:

  1. Natural Ordering বা Custom Comparator: উপাদানগুলি তাদের প্রাকৃতিক অর্ডার বা নির্ধারিত কম্পারেটর অনুযায়ী সাজানো হয়।
  2. থ্রেড-সেফ: একাধিক থ্রেড থেকে উপাদান যোগ বা পড়া যায়।
  3. নন-ব্লকিং poll(): যদি কিউ খালি হয়, তবে poll() মেথড তাৎক্ষণিকভাবে null রিটার্ন করবে।

PriorityBlockingQueue উদাহরণ

প্রতিটি কাজকে একটি প্রায়োরিটি দিয়ে কিউতে সংরক্ষণ ও প্রসেস করা।

import java.util.concurrent.PriorityBlockingQueue;

// টাস্ক ক্লাস যার একটি প্রায়োরিটি থাকবে
class Task implements Comparable<Task> {
    private final String name;
    private final int priority;

    public Task(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    @Override
    public int compareTo(Task other) {
        return Integer.compare(this.priority, other.priority); // Priority অনুযায়ী তুলনা
    }

    @Override
    public String toString() {
        return "Task{name='" + name + "', priority=" + priority + '}';
    }
}

public class PriorityBlockingQueueExample {
    public static void main(String[] args) throws InterruptedException {
        PriorityBlockingQueue<Task> priorityQueue = new PriorityBlockingQueue<>();

        // কাজ যোগ করা
        priorityQueue.put(new Task("Low Priority Task", 3));
        priorityQueue.put(new Task("High Priority Task", 1));
        priorityQueue.put(new Task("Medium Priority Task", 2));

        System.out.println("Tasks are being processed...");

        // কাজ প্রসেস করা
        while (!priorityQueue.isEmpty()) {
            Task task = priorityQueue.take(); // ব্লকিং কল
            System.out.println("Processed: " + task);
        }

        System.out.println("All tasks processed.");
    }
}

আউটপুট:

  1. High Priority Task (priority=1) প্রথম প্রসেস হবে।
  2. Medium Priority Task (priority=2) দ্বিতীয়।
  3. Low Priority Task (priority=3) সর্বশেষ।

DelayQueue এবং PriorityBlockingQueue এর তুলনা

বৈশিষ্ট্যDelayQueuePriorityBlockingQueue
মূল বৈশিষ্ট্যনির্দিষ্ট সময় পরে উপাদান প্রসেস করেউপাদান প্রায়োরিটি অনুযায়ী প্রসেস করে
ডেটা অর্ডারিংসময়-ভিত্তিকপ্রায়োরিটি বা natural order
ব্যবহার ক্ষেত্রডেলেইড মেসেজ সিস্টেমকাজের প্রায়োরিটি ভিত্তিক শিডিউলিং
থ্রেড-সেফহ্যাঁহ্যাঁ

  • DelayQueue: সময় ভিত্তিক কাজ বা মেসেজ ডেলিভারির জন্য ব্যবহার করুন।
  • PriorityBlockingQueue: প্রায়োরিটি ভিত্তিক কাজের শিডিউলিংয়ের জন্য উপযুক্ত।

এই কিউগুলো মাল্টিথ্রেডেড পরিবেশে ডেটা ম্যানেজমেন্টকে সহজ ও কার্যকর করে।

Content added By
Promotion

Are you sure to start over?

Loading...