Blocking এবং Non-blocking Channel

Channels এর ব্যবহার - জাভা নিও (Java Nio) - Java Technologies

340

Java NIO (New I/O) একটি শক্তিশালী API যা Blocking এবং Non-blocking I/O অপারেশন করার জন্য ব্যবহৃত হয়। এই দুটি ধরনের চ্যানেল প্রধানত Channel-এ ব্যবহৃত হয় এবং তাদের মধ্যে পার্থক্য হল যে, Blocking Channel যখন কোনো I/O অপারেশন সম্পন্ন হয় না, তখন সেগুলো অপেক্ষা করতে থাকে, আর Non-blocking Channel এক্ষেত্রে অন্য কাজ করতে সক্ষম হয় এবং অবিলম্বে ফিরতে পারে।

এই লেখায় Blocking এবং Non-blocking Channels এর মধ্যে পার্থক্য এবং তাদের কাজের ধরন বিস্তারিতভাবে আলোচনা করা হবে।


Blocking Channel

Blocking Channels হল এমন চ্যানেল যা I/O অপারেশন সম্পাদন করার সময় অন্য কোনো কাজ করতে দেয় না। যখন একটি ব্লকিং চ্যানেল একটি I/O অপারেশন (যেমন ডেটা পড়া বা লেখা) সম্পাদন করে, তখন এটি পুরো অপারেশন শেষ না হওয়া পর্যন্ত থেমে থাকে (ব্লক করে)। ব্লকিং চ্যানেলগুলি সাধারণত FileChannel, SocketChannel, ServerSocketChannel এর মতো ব্যবহৃত হয়।

Blocking Channel এর কাজ

  • যখন Blocking Channel কোনো I/O অপারেশন করতে যায় (যেমন ফাইল থেকে ডেটা পড়া বা নেটওয়ার্ক থেকে ডেটা পাঠানো), তখন এটি সেই অপারেশনটি সম্পন্ন না হওয়া পর্যন্ত থেমে থাকে।
  • উদাহরণস্বরূপ, যখন আপনি একটি ব্লকিং চ্যানেল ব্যবহার করে ফাইল থেকে ডেটা পড়ছেন, তখন আপনার প্রোগ্রাম অপেক্ষা করবে যতক্ষণ না সমস্ত ডেটা পড়া না হয়ে যায়।

Blocking Channel উদাহরণ:

import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.ByteBuffer;

public class BlockingChannelExample {
    public static void main(String[] args) throws Exception {
        RandomAccessFile file = new RandomAccessFile("example.txt", "r");
        FileChannel channel = file.getChannel();
        
        ByteBuffer buffer = ByteBuffer.allocate(128);
        
        // Blocking read operation
        int bytesRead = channel.read(buffer);
        
        // Process the data
        while (bytesRead != -1) {
            buffer.flip();
            while (buffer.hasRemaining()) {
                System.out.print((char) buffer.get());
            }
            buffer.clear();
            bytesRead = channel.read(buffer);  // Blocking until data is read
        }
        file.close();
    }
}

এখানে, read() মেথডটি একটি ব্লকিং অপারেশন, যার মানে হল যে, ফাইল থেকে ডেটা না পড়া পর্যন্ত এটি থেমে থাকবে। এটি শুধুমাত্র ডেটা পড়ার পরেই পরবর্তী লাইনটি এক্সিকিউট হবে।


Non-blocking Channel

Non-blocking Channels হল এমন চ্যানেল যা I/O অপারেশন সম্পাদন করার সময় থেমে থাকে না এবং তাৎক্ষণিকভাবে কাজ করতে থাকে। Non-blocking I/O এর মাধ্যমে, চ্যানেল এক বা একাধিক I/O অপারেশন পরিচালনা করার সময় থামে না এবং অন্য কাজ সম্পাদন করতে পারে।

Non-blocking Channel এর কাজ

  • Non-blocking Channel চ্যানেল যখন I/O অপারেশন করতে যায় (যেমন ডেটা পাঠানো বা ডেটা গ্রহণ), তখন এটি অপারেশনটি অবিলম্বে না করে অন্য কাজ করতে সক্ষম হয়।
  • আপনি configureBlocking(false) ব্যবহার করে একটি Non-blocking Channel তৈরি করতে পারেন। এতে, যখন কোনো I/O অপারেশন চলছে, তখন চ্যানেল থামে না এবং পরবর্তী কাজগুলো চালিয়ে যেতে পারে।

Non-blocking Channel উদাহরণ:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NonBlockingChannelExample {
    public static void main(String[] args) throws IOException {
        // Non-blocking SocketChannel তৈরি
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);
        
        socketChannel.connect(new InetSocketAddress("localhost", 8080));
        
        while (!socketChannel.finishConnect()) {
            // অন্য কাজ করা যেতে পারে যখন নেটওয়ার্কের সাথে সংযোগ হচ্ছে
            System.out.println("Connecting to server...");
        }

        // ডেটা পাঠানো
        ByteBuffer buffer = ByteBuffer.wrap("Hello Server".getBytes());
        while (buffer.hasRemaining()) {
            socketChannel.write(buffer);  // Non-blocking write operation
        }

        socketChannel.close();
    }
}

এখানে, finishConnect() এবং write() মেথডগুলো নন-ব্লকিং অপারেশন হিসেবে কাজ করে। আপনি দেখতে পাবেন যে socketChannel সংযোগ স্থাপন করতে হলে অবিলম্বে থামে না, বরং অন্য কাজ করতে পারে।


Blocking এবং Non-blocking Channel এর মধ্যে পার্থক্য

বিষয়Blocking ChannelNon-blocking Channel
অপারেশন স্টাইলঅপারেশন চলাকালে থেমে থাকেঅপারেশন চলাকালে থেমে থাকে না
ব্যবহারসিঙ্গেল থ্রেড বা সাধারণ I/O অপারেশনঅ্যাসিঙ্ক্রোনাস, প্যারালাল প্রোগ্রামিং
পারফরম্যান্সঅনেক সময় অপারেশন দ্রুত শেষ হয় না (বিশেষত বড় ডেটা বা নেটওয়ার্ক অপারেশনের ক্ষেত্রে)অপারেশন থামানোর দরকার নেই, কাজ চালিয়ে যেতে পারে
চ্যানেলFileChannel, ServerSocketChannel, SocketChannelFileChannel, SocketChannel, DatagramChannel (non-blocking mode)
উদাহরণread()write() ব্লকিং অপারেশনselect()write() নন-ব্লকিং অপারেশন

Blocking এবং Non-blocking Channels এর মধ্যে পার্থক্য হল যে ব্লকিং চ্যানেল একাধিক I/O অপারেশন সম্পাদন করার সময় থেমে থাকে, যখন নন-ব্লকিং চ্যানেল থামে না এবং অন্যান্য কাজ করতে থাকে।

  • Blocking Channels সাধারণত সহজ এবং নির্ভরযোগ্য, তবে বড় সিস্টেমে দক্ষতা কম হতে পারে যেখানে একাধিক I/O অপারেশন একযোগে পরিচালনা করতে হয়।
  • Non-blocking Channels বড় এবং প্যারালাল প্রোগ্রামিংয়ে বেশ কার্যকর, কারণ তারা কাজ করার সময় থেমে না থেকে দ্রুত একাধিক কাজ সম্পাদন করতে সক্ষম হয়।

Java NIO-তে এই দুটি চ্যানেলের ব্যবহার পরিস্থিতি এবং কার্যকারিতা বুঝে নির্বাচন করা জরুরি, যাতে আপনার অ্যাপ্লিকেশনটি যথাযথভাবে এবং কার্যকরভাবে কাজ করতে পারে।


Content added By
Promotion

Are you sure to start over?

Loading...