Inter-Thread Communication এর জন্য Piped Streams ব্যবহার

PipedInputStream এবং PipedOutputStream - জাভা আইও (Java.io Package) - Java Technologies

316

Piped Streams Java I/O প্যাকেজে একটি বিশেষ ধরনের স্ট্রীম যা inter-thread communication এর জন্য ব্যবহৃত হয়। এটি এক থ্রেড থেকে অন্য থ্রেডে ডেটা পাঠানোর জন্য ডিজাইন করা হয়েছে। PipedInputStream এবং PipedOutputStream ক্লাসগুলি ব্যবহার করে এক থ্রেড থেকে অন্য থ্রেডে ডেটা প্রেরণ এবং গ্রহণ করা যেতে পারে।

এই পদ্ধতিটি মূলত Producer-Consumer সমস্যা সমাধানে ব্যবহৃত হয়, যেখানে একটি থ্রেড ডেটা তৈরি (প্রযোজক বা producer) করে এবং অন্য একটি থ্রেড সেটি গ্রহণ (ভোক্তা বা consumer) করে।


Piped Streams এর ধারণা:

  1. PipedInputStream: এটি InputStream এর একটি সাবক্লাস, যা producer থ্রেডের দ্বারা লেখা ডেটা consumer থ্রেডের দ্বারা পড়া হয়। এটি byte stream ব্যবহারের জন্য উপযুক্ত।
  2. PipedOutputStream: এটি OutputStream এর একটি সাবক্লাস, যা ডেটা consumer থ্রেডের কাছে পাঠানোর জন্য ব্যবহৃত হয়। এটি byte stream ব্যবহারের জন্য উপযুক্ত।
  3. PipedReader: এটি Reader এর একটি সাবক্লাস, যা character stream ব্যবহৃত হয়।
  4. PipedWriter: এটি Writer এর একটি সাবক্লাস, যা character stream ব্যবহৃত হয়।

Piped Streams এর ব্যবহার:

  • Producer-Consumer থ্রেড মডেল ব্যবহৃত হয়, যেখানে একটি থ্রেড producer হিসেবে কাজ করে এবং অন্যটি consumer হিসেবে।
  • PipedInputStream এবং PipedOutputStream এর মধ্যে সংযোগ স্থাপন করা হয়। এক থ্রেড PipedOutputStream ব্যবহার করে ডেটা লিখে এবং অন্য থ্রেড PipedInputStream ব্যবহার করে সেই ডেটা পড়ে।
  • PipedReader এবং PipedWriter একইভাবে character streams ব্যবহারের জন্য ব্যবহৃত হয়।

Piped Streams উদাহরণ (Inter-Thread Communication):

এই উদাহরণে, একটি থ্রেড Producer ডেটা তৈরি করবে এবং তা PipedOutputStream এর মাধ্যমে পাঠাবে। অন্য একটি থ্রেড Consumer সেই ডেটা PipedInputStream এর মাধ্যমে পড়বে।

Producer এবং Consumer থ্রেড উদাহরণ:

import java.io.*;

class Producer extends Thread {
    private PipedOutputStream pipedOutputStream;

    public Producer(PipedOutputStream pipedOutputStream) {
        this.pipedOutputStream = pipedOutputStream;
    }

    @Override
    public void run() {
        String message = "Hello from Producer Thread!";
        try {
            // পিপেড আউটপুট স্ট্রীমে ডেটা লিখা হচ্ছে
            pipedOutputStream.write(message.getBytes());
            System.out.println("Producer Thread: Message sent");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Consumer extends Thread {
    private PipedInputStream pipedInputStream;

    public Consumer(PipedInputStream pipedInputStream) {
        this.pipedInputStream = pipedInputStream;
    }

    @Override
    public void run() {
        try {
            // পিপেড ইনপুট স্ট্রীম থেকে ডেটা পড়া হচ্ছে
            byte[] buffer = new byte[1024];
            int bytesRead = pipedInputStream.read(buffer);
            String message = new String(buffer, 0, bytesRead);
            System.out.println("Consumer Thread: Received message - " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class PipedStreamExample {
    public static void main(String[] args) {
        try {
            // PipedOutputStream এবং PipedInputStream তৈরি
            PipedOutputStream pipedOutputStream = new PipedOutputStream();
            PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream);

            // Producer এবং Consumer থ্রেড তৈরি
            Producer producer = new Producer(pipedOutputStream);
            Consumer consumer = new Consumer(pipedInputStream);

            // থ্রেড শুরু করা হচ্ছে
            producer.start();
            consumer.start();

            // থ্রেডগুলো শেষ হওয়া পর্যন্ত অপেক্ষা করা
            producer.join();
            consumer.join();

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. Producer থ্রেড PipedOutputStream ব্যবহার করে ডেটা লেখে।
  2. Consumer থ্রেড PipedInputStream ব্যবহার করে সেই ডেটা পড়ে।
  3. PipedOutputStream এবং PipedInputStream এর মধ্যে যোগাযোগ স্থাপন করার জন্য একটি পাইপ তৈরি করা হয়েছে।
  4. Producer এবং Consumer থ্রেডগুলি একে অপরের সাথে যোগাযোগের জন্য একটি পাইপ ব্যবহার করছে। Producer ডেটা পাঠিয়ে দেয় এবং Consumer সেই ডেটা গ্রহণ করে।

আউটপুট:

Producer Thread: Message sent
Consumer Thread: Received message - Hello from Producer Thread!

Piped Streams এর সুবিধা:

  1. Inter-Thread Communication:
    • Piped Streams এক থ্রেড থেকে অন্য থ্রেডে ডেটা পাঠানোর জন্য খুবই কার্যকরী। এটি producer-consumer প্যাটার্নে কাজ করার জন্য বিশেষভাবে উপযোগী।
  2. Real-Time Data Transfer:
    • এটি দুইটি থ্রেডের মধ্যে ডেটা স্থানান্তর দ্রুত এবং লাইভ ভিত্তিতে সম্পাদন করতে পারে।
  3. Synchronization:
    • PipedStream এ ডেটা লেখার পরে, অন্য থ্রেড স্বয়ংক্রিয়ভাবে সেই ডেটা পড়তে পারে। এটি একে অপরের মধ্যে সিঙ্ক্রোনাইজেশনের জন্য সহায়ক।

Piped Streams এর সীমাবদ্ধতা:

  1. Data Blocking:
    • Piped Streams ব্লকিং প্রাকৃতিক হয়ে থাকে, অর্থাৎ যখন একটি থ্রেড পিপেড আউটপুট স্ট্রীমে ডেটা লেখে না, তখন অন্য থ্রেড পিপেড ইনপুট স্ট্রীমে ডেটা পড়তে পারে না।
  2. One-way Communication:
    • Piped Streams সাধারণত one-way communication এর জন্য ব্যবহৃত হয়। এক থ্রেড ডেটা পাঠায় এবং অন্য থ্রেড সেটি পড়ে।
  3. Potential Deadlock:
    • যদি আপনি পিপেড ইনপুট এবং আউটপুট স্ট্রীমে একসাথে ডেটা পাঠানোর চেষ্টা করেন এবং পাঠানোর ও পড়ার সঠিক সিঙ্ক্রোনাইজেশন না থাকে, তাহলে deadlock হতে পারে।

  • Piped Streams Java-তে inter-thread communication এর জন্য একটি শক্তিশালী টুল।
  • PipedOutputStream এবং PipedInputStream ব্যবহার করে থ্রেডগুলির মধ্যে ডেটা পাঠানো এবং গ্রহণ করা যায়।
  • এটি producer-consumer model এ কাজ করতে সহায়ক, যেখানে এক থ্রেড ডেটা তৈরি করে এবং অন্যটি সেটি গ্রহণ করে।

Piped Streams ব্যবহারের মাধ্যমে আপনি multi-threaded অ্যাপ্লিকেশনে কার্যকরীভাবে ডেটা স্থানান্তর করতে পারেন, বিশেষত যখন real-time data transfer বা data streaming প্রয়োজন।

Content added By
Promotion

Are you sure to start over?

Loading...