DelayQueue, PriorityBlockingQueue এবং SynchronousQueue এর ব্যবহার

BlockingQueue এবং Producer-Consumer Pattern - জাভা কনকারেন্সি (Java Concurrency) - Java Technologies

328

জাভা কনকারেন্সি হলো মাল্টিথ্রেডিং এবং সিঙ্ক্রোনাইজড প্রোগ্রামিংয়ের জন্য একটি শক্তিশালী প্যাকেজ (java.util.concurrent)। এটি ডেটা শেয়ারিং এবং থ্রেডের মধ্যে সমন্বয় পরিচালনার জন্য কার্যকরী টুলস প্রদান করে।


DelayQueue

DelayQueue কী?

  • DelayQueue হলো একটি ব্লকিং কিউ যা Delayed ইন্টারফেস ইমপ্লিমেন্ট করা অবজেক্ট রাখে।
  • অবজেক্টগুলো নির্দিষ্ট সময় পর কিউ থেকে তোলা যায়।
  • এটি টাইম-সেন্সিটিভ টাস্ক প্রসেসিংয়ের জন্য আদর্শ।

ব্যবহার:

  • Task Scheduling: নির্দিষ্ট সময় পরে কোনো টাস্ক চালানোর জন্য।
  • Caching: অবজেক্টের টাইম টু লাইভ (TTL) ম্যানেজ করতে।

উদাহরণ:

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

class DelayedTask implements Delayed {
    private final String name;
    private final long startTime;

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

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

    @Override
    public int compareTo(Delayed o) {
        return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
    }

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

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

        // Adding tasks
        queue.put(new DelayedTask("Task1", 2000));
        queue.put(new DelayedTask("Task2", 4000));
        queue.put(new DelayedTask("Task3", 1000));

        // Processing tasks
        while (!queue.isEmpty()) {
            DelayedTask task = queue.take(); // Waits until the delay expires
            System.out.println("Processed: " + task);
        }
    }
}

PriorityBlockingQueue

PriorityBlockingQueue কী?

  • PriorityBlockingQueue হলো একটি থ্রেড-সেফ ব্লকিং কিউ যা এলিমেন্টগুলোকে তাদের প্রায়োরিটির ভিত্তিতে সাজায়।
  • Comparable ইন্টারফেস বা Comparator এর মাধ্যমে প্রায়োরিটি নির্ধারণ করা হয়।

ব্যবহার:

  • Task Priority Management: উচ্চ-প্রায়োরিটির টাস্ক আগে প্রসেস করতে।
  • Job Scheduling: মাল্টি-জব ম্যানেজমেন্ট সিস্টেমে।

উদাহরণ:

import java.util.concurrent.*;

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

        // Adding elements
        queue.put("Low Priority");
        queue.put("High Priority");
        queue.put("Medium Priority");

        // Retrieving elements (Natural Order or Comparable)
        while (!queue.isEmpty()) {
            System.out.println("Processed: " + queue.take());
        }
    }
}

SynchronousQueue

SynchronousQueue কী?

  • SynchronousQueue একটি বিশেষ ধরনের ব্লকিং কিউ, যেখানে কোনো স্টোরেজ ক্ষমতা নেই। প্রতিটি put() মেথডের জন্য একটি take() কল থাকা আবশ্যক।
  • এটি direct handoff করার জন্য ব্যবহৃত হয়।

ব্যবহার:

  • Thread Communication: প্রোডিউসার এবং কনজিউমারের মধ্যে সরাসরি ডেটা শেয়ার।
  • Load Balancing: একাধিক থ্রেডের মধ্যে কাজ ভাগাভাগি করতে।

উদাহরণ:

import java.util.concurrent.*;

public class SynchronousQueueExample {
    public static void main(String[] args) {
        SynchronousQueue<String> queue = new SynchronousQueue<>();

        // Producer Thread
        new Thread(() -> {
            try {
                System.out.println("Putting: Task1");
                queue.put("Task1");
                System.out.println("Putting: Task2");
                queue.put("Task2");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        // Consumer Thread
        new Thread(() -> {
            try {
                System.out.println("Taken: " + queue.take());
                System.out.println("Taken: " + queue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

কনকারেন্সি টুলসের তুলনা

Queue TypeUse CaseBlocking Behavior
DelayQueueটাইম-বেজড টাস্ক শিডিউলিং।ডেটা তখনই অ্যাক্সেসযোগ্য যখন টাইম এক্সপায়ার।
PriorityBlockingQueueপ্রায়োরিটি বেসড ডেটা প্রসেসিং।ব্লক হয় না; সর্বোচ্চ প্রায়োরিটি এলিমেন্ট আগে প্রসেস হয়।
SynchronousQueueপ্রোডিউসার-কনজিউমার সরাসরি ডেটা শেয়ারিং।প্রতিটি put() এর জন্য একটি take() প্রয়োজন।

  • DelayQueue নির্দিষ্ট সময় পর টাস্ক প্রসেস করার জন্য।
  • PriorityBlockingQueue প্রায়োরিটি নির্ভর ডেটা প্রসেসিংয়ে।
  • SynchronousQueue থ্রেডের মধ্যে ডেটা আদান-প্রদানে। জাভার কনকারেন্সি টুলস সঠিকভাবে ব্যবহার করলে মাল্টিথ্রেডেড অ্যাপ্লিকেশন আরও কার্যকর এবং নির্ভরযোগ্য হয়।
Content added By
Promotion

Are you sure to start over?

Loading...