Non-blocking I/O এবং Multithreading এর প্রয়োগ

Java NIO এবং Multithreading - জাভা নিও (Java Nio) - Java Technologies

325

Java NIO (New I/O) একটি শক্তিশালী API যা Non-blocking I/O অপারেশন এবং Multithreading সমর্থন করে। Non-blocking I/O এবং Multithreading একত্রে ব্যবহার করলে একাধিক I/O অপারেশনকে একসাথে কার্যকরভাবে পরিচালনা করা সম্ভব হয়, যার ফলে উচ্চ কার্যক্ষমতা এবং স্কেলেবিলিটি নিশ্চিত হয়।

Java NIO তে Non-blocking I/O এর মাধ্যমে একটি থ্রেড একাধিক I/O অপারেশন সম্পাদন করতে পারে, তবে সেটি ব্লক হবে না, অর্থাৎ থ্রেডটি কোনো I/O অপারেশন সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করবে না। এটি একটি থ্রেডকে অন্যান্য কাজ করতে সক্ষম করে, যেমন নেটওয়ার্ক অ্যাপ্লিকেশন তৈরি করা, যেখানে একাধিক ক্লায়েন্টের সাথে কাজ করতে হয়।

এখানে, আমরা দেখব কিভাবে Java NIO তে Non-blocking I/O এবং Multithreading একসাথে কাজ করে।


Non-blocking I/O কি?

Non-blocking I/O এমন একটি মেকানিজম যেখানে থ্রেড কোন I/O অপারেশন (যেমন ফাইল রিডিং, নেটওয়ার্ক ডেটা রিসিভ করা) সম্পন্ন না হওয়া পর্যন্ত ব্লক হয় না। এর মানে হল যে যখন কোনো I/O অপারেশন চলছে, তখন থ্রেডটি অন্য কাজ করতে পারে, এবং যখন I/O অপারেশন সম্পন্ন হবে, তখন সেই থ্রেডটি তার ফলাফল গ্রহণ করতে সক্ষম হবে।

Java NIO তে Selectors, Channels, এবং Buffers ব্যবহার করে Non-blocking I/O অপারেশন বাস্তবায়ন করা হয়।


Multithreading এর প্রয়োগ

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

Non-blocking I/O এবং Multithreading এর সম্মিলিত প্রয়োগ

Java NIO তে Selectors ব্যবহার করে একাধিক I/O অপারেশন সমান্তরালে চালানো যায়, এবং Multithreading ব্যবহার করে আমরা প্রতিটি I/O অপারেশন আলাদা থ্রেডে পরিচালনা করতে পারি। এর ফলে একাধিক ক্লায়েন্ট বা সংযোগের সাথে দ্রুত কাজ করা যায়।


উদাহরণ: Non-blocking I/O এবং Multithreading এর ব্যবহার

এখানে আমরা একটি উদাহরণ দেখব যেখানে Non-blocking I/O এবং Multithreading ব্যবহার করে একটি সার্ভার তৈরি করা হবে, যা একাধিক ক্লায়েন্টের সাথে একযোগে যোগাযোগ করবে। Selector ব্যবহৃত হবে, যা একাধিক SocketChannel থেকে ডেটা পড়বে।

১. Server Socket (ServerThread)

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

public class NonBlockingServer implements Runnable {

    private Selector selector;
    private ServerSocketChannel serverSocketChannel;

    public NonBlockingServer() throws IOException {
        // Create a selector
        selector = Selector.open();

        // Create a ServerSocketChannel
        serverSocketChannel = ServerSocketChannel.open();
        serverSocketChannel.bind(new InetSocketAddress("localhost", 8080));
        serverSocketChannel.configureBlocking(false); // Set the server to non-blocking
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // Register server to listen for accept
    }

    @Override
    public void run() {
        try {
            while (true) {
                // Select channels that are ready for I/O
                selector.select();

                // Get selected keys (channels that are ready for I/O)
                for (SelectionKey key : selector.selectedKeys()) {
                    if (key.isAcceptable()) {
                        // Accept client connections
                        SocketChannel clientChannel = serverSocketChannel.accept();
                        clientChannel.configureBlocking(false);
                        clientChannel.register(selector, SelectionKey.OP_READ);
                    } else if (key.isReadable()) {
                        // Read data from client
                        SocketChannel clientChannel = (SocketChannel) key.channel();
                        ByteBuffer buffer = ByteBuffer.allocate(256);
                        int bytesRead = clientChannel.read(buffer);
                        if (bytesRead == -1) {
                            clientChannel.close();
                        } else {
                            buffer.flip();
                            while (buffer.hasRemaining()) {
                                System.out.print((char) buffer.get());
                            }
                        }
                    }
                    selector.selectedKeys().remove(key);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        NonBlockingServer server = new NonBlockingServer();
        Thread serverThread = new Thread(server);
        serverThread.start(); // Run the server in a separate thread
    }
}

ব্যাখ্যা:

  • Selector: এটি সার্ভারের মাধ্যমে একাধিক ক্লায়েন্টের সংযোগের জন্য ব্যবহৃত হয় এবং ক্লায়েন্টের সাথে যোগাযোগ করার জন্য নির্বাচিত চ্যানেল গুলি সনাক্ত করে।
  • ServerSocketChannel: এটি সার্ভারের জন্য নেটওয়ার্ক সংযোগ তৈরি করে এবং ক্লায়েন্টের সাথে সংযোগ তৈরি করতে ব্যবহৃত হয়।
  • Non-blocking I/O: serverSocketChannel.configureBlocking(false) ব্যবহার করা হয়েছে, যা সার্ভারকে নন-ব্লকিং I/O মোডে সেট করে।

২. Client Socket (ClientThread)

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

public class ClientThread implements Runnable {

    private SocketChannel socketChannel;

    public ClientThread() throws IOException {
        // Open a SocketChannel and connect to the server
        socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);
        socketChannel.connect(new InetSocketAddress("localhost", 8080));
    }

    @Override
    public void run() {
        try {
            while (!socketChannel.finishConnect()) {
                // Wait for the connection to be established
            }

            String message = "Hello from the client!";
            ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());

            // Write the message to the server
            socketChannel.write(buffer);
            socketChannel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        ClientThread client = new ClientThread();
        Thread clientThread = new Thread(client);
        clientThread.start(); // Run the client in a separate thread
    }
}

ব্যাখ্যা:

  • SocketChannel: এটি ক্লায়েন্ট সাইডে TCP/IP সংযোগ তৈরি করতে ব্যবহৃত হয়।
  • Non-blocking I/O: socketChannel.configureBlocking(false) ব্যবহার করা হয়েছে, যা ক্লায়েন্টকে নন-ব্লকিং মোডে সেট করে।
  • Multithreading: ক্লায়েন্ট এবং সার্ভার আলাদা থ্রেডে রান হচ্ছে, যাতে একাধিক ক্লায়েন্টের সাথে সমান্তরালভাবে যোগাযোগ করা যায়।

Java NIO এর Non-blocking I/O এবং Multithreading এর মাধ্যমে আপনি একাধিক I/O অপারেশন এবং সংযোগ দক্ষভাবে পরিচালনা করতে পারেন। Selectors, SocketChannel, এবং ServerSocketChannel এর সাহায্যে আপনি নেটওয়ার্কে একাধিক ক্লায়েন্টের সাথে যোগাযোগ করতে পারবেন, এবং থ্রেডিং ব্যবহারের মাধ্যমে একাধিক কাজ সমান্তরালে কার্যকরভাবে সম্পাদন করতে পারবেন।

এই প্রযুক্তি high-performance এবং scalable সার্ভার তৈরি করতে সহায়ক, যেখানে একাধিক ক্লায়েন্টের সংযোগ পরিচালনা করা হয়, এবং থ্রেডগুলোর মধ্যে সমন্বয় সহজে করা যায়।


Content added By
Promotion

Are you sure to start over?

Loading...