মাল্টিথ্রেডিং এবং থ্রেড ক্লাস

সি# এ মাল্টিথ্রেডিং একটি গুরুত্বপূর্ণ ফিচার, যা একই সময়ে একাধিক কাজ সম্পন্ন করতে সহায়তা করে। মাল্টিথ্রেডিংয়ের মাধ্যমে একটি প্রোগ্রামে একাধিক থ্রেড চালানো যায়, যাতে তারা সমান্তরালে কাজ করে এবং প্রোগ্রামের কার্যক্ষমতা বাড়ায়। সি# এ মাল্টিথ্রেডিং করতে Thread ক্লাস ব্যবহৃত হয়, যা System.Threading নেমস্পেসের অংশ।


মাল্টিথ্রেডিং এর ধারণা

একটি থ্রেড হলো কোড এক্সিকিউশনের একটি নির্দিষ্ট পথ। মাল্টিথ্রেডিং এর মাধ্যমে প্রোগ্রামে একাধিক থ্রেড তৈরি করে একই সময়ে বিভিন্ন কাজ চালানো যায়। এতে:

  • পারফরম্যান্স বাড়ানো যায়: একাধিক কাজ একই সময়ে করা যায়।
  • Responsive UI: গ্রাফিকাল ইউজার ইন্টারফেসে (GUI) মাল্টিথ্রেডিং ব্যবহার করে প্রোগ্রামকে বেশি সাড়া জাগানো যায়।

Thread ক্লাস

Thread ক্লাস ব্যবহার করে একটি নতুন থ্রেড তৈরি এবং নিয়ন্ত্রণ করা যায়। এটি বিভিন্ন মেথড ও প্রোপার্টি সরবরাহ করে, যা থ্রেডের জীবনচক্র নিয়ন্ত্রণে সহায়তা করে।

থ্রেড তৈরি করা

একটি নতুন থ্রেড তৈরি করতে Thread ক্লাস ব্যবহার করে ThreadStart ডেলিগেটের মাধ্যমে নির্দিষ্ট মেথডে থ্রেড সেট করা হয়।

using System;
using System.Threading;

public class Program
{
    public static void PrintNumbers()
    {
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine(i);
            Thread.Sleep(1000); // এক সেকেন্ড অপেক্ষা
        }
    }

    public static void Main()
    {
        // থ্রেড তৈরি করা
        Thread thread = new Thread(PrintNumbers);
        thread.Start();

        Console.WriteLine("Main thread is running independently.");
    }
}

ব্যাখ্যা

  1. Thread Creation: new Thread(PrintNumbers) দিয়ে একটি নতুন থ্রেড তৈরি করা হয়েছে, যা PrintNumbers মেথডে কাজ করবে।
  2. Thread.Start(): Start() মেথড দিয়ে থ্রেড চালু করা হয়েছে।
  3. Thread.Sleep(1000): Sleep মেথড দিয়ে থ্রেড এক সেকেন্ড অপেক্ষা করবে (milliseconds হিসাবে), অর্থাৎ প্রতিটি সংখ্যা এক সেকেন্ডের ব্যবধানে প্রিন্ট করবে।

থ্রেডের প্রাধান্য (Priority)

থ্রেডের Priority সেট করে কাজের গুরুত্ব অনুযায়ী থ্রেড চালানো যায়। ThreadPriority এনাম ব্যবহার করে থ্রেডের প্রাধান্য নির্ধারণ করা হয়, যেমন Highest, AboveNormal, Normal, BelowNormal, এবং Lowest

thread.Priority = ThreadPriority.Highest;

থ্রেড স্থগিত এবং পুনরায় শুরু (Pause and Resume)

সি# এ থ্রেডকে Sleep মেথড দিয়ে সাময়িকভাবে স্থগিত করা যায়, তবে থ্রেডকে পুনরায় শুরু করার জন্য Suspend এবং Resume মেথড এখন আর ব্যবহৃত হয় না, কারণ এগুলো ডেডলকের কারণ হতে পারে। বরং থ্রেড কন্ট্রোলের জন্য মানসিক কোড লজিক ব্যবহার করা হয়।


থ্রেড জয়েন (Thread Join)

Join() মেথড ব্যবহার করে বর্তমান থ্রেডকে অপেক্ষা করানো যায় যতক্ষণ না নির্দিষ্ট থ্রেড কাজ শেষ করে।

Thread thread = new Thread(PrintNumbers);
thread.Start();
thread.Join(); // Main thread waits until this thread completes

Console.WriteLine("Main thread resumes after the other thread completes.");

ব্যাখ্যা

thread.Join() ব্যবহার করলে মেইন থ্রেড অপেক্ষা করবে যতক্ষণ না PrintNumbers থ্রেড কাজ শেষ করে। এরপর মেইন থ্রেড পরবর্তী কোড চালাবে।


থ্রেড সিঙ্ক্রোনাইজেশন

যদি একাধিক থ্রেড একই রিসোর্স অ্যাক্সেস করে, তবে ডেটা ইনকনসিস্টেন্সি ঘটতে পারে। এই সমস্যা সমাধানের জন্য lock ব্যবহার করা হয়, যা একবারে কেবলমাত্র একটি থ্রেডকে রিসোর্স অ্যাক্সেস করার অনুমতি দেয়।

using System;
using System.Threading;

public class Program
{
    private static readonly object lockObj = new object();

    public static void PrintNumbers()
    {
        lock (lockObj)
        {
            for (int i = 1; i <= 5; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(500);
            }
        }
    }

    public static void Main()
    {
        Thread thread1 = new Thread(PrintNumbers);
        Thread thread2 = new Thread(PrintNumbers);

        thread1.Start();
        thread2.Start();
    }
}

ব্যাখ্যা

  1. lock: lock (lockObj) দিয়ে একবারে একটি থ্রেডকে PrintNumbers মেথডের মধ্যে এক্সিকিউট করার অনুমতি দেওয়া হয়েছে।
  2. lockObj অবজেক্ট দ্বারা সিঙ্ক্রোনাইজেশন নিশ্চিত করা হয়েছে, যাতে একই সময়ে কেবলমাত্র একটি থ্রেডই PrintNumbers মেথড অ্যাক্সেস করতে পারে।

থ্রেড অ্যাবোর্ট (Abort)

Abort() মেথড ব্যবহার করে থ্রেডকে বন্ধ করা যায়, তবে এটি প্রায়শই এড়িয়ে চলা হয় কারণ এটি থ্রেডের জীবনচক্রে সমস্যা তৈরি করতে পারে।

Thread thread = new Thread(PrintNumbers);
thread.Start();
thread.Abort(); // Thread forcibly terminated

নোট: থ্রেড অ্যাবোর্ট অপ্রচলিত এবং এটি ব্যবহার করা বিপজ্জনক হতে পারে। Abort এর পরিবর্তে থ্রেড বন্ধ করার জন্য বিকল্প পদ্ধতি ব্যবহার করা উচিত, যেমন একটি ফ্ল্যাগ পরিবর্তন করে থ্রেড বন্ধ করা।


একটি পূর্ণ উদাহরণ যেখানে মাল্টিপল থ্রেড ব্যবহার করা হয়েছে

csharp

Copy code

using System;
using System.Threading;

public class Program
{
    public static void PrintNumbers()
    {
        for (int i = 1; i <= 5; i++)
        {
            Console.WriteLine("Number: " + i);
            Thread.Sleep(500);
        }
    }

    public static void PrintLetters()
    {
        for (char letter = 'A'; letter <= 'E'; letter++)
        {
            Console.WriteLine("Letter: " + letter);
            Thread.Sleep(500);
        }
    }

    public static void Main()
    {
        Thread thread1 = new Thread(PrintNumbers);
        Thread thread2 = new Thread(PrintLetters);

        thread1.Start();
        thread2.Start();

        thread1.Join();
        thread2.Join();

        Console.WriteLine("Both threads have completed.");
    }
}

ব্যাখ্যা

  1. PrintNumbers এবং PrintLetters নামে দুটি আলাদা মেথড আছে।
  2. thread1 এবং thread2 নামে দুটি থ্রেড তৈরি করে সেগুলোকে দুটি মেথডে এসাইন করা হয়েছে।
  3. thread1.Start() এবং thread2.Start() দিয়ে থ্রেড চালানো হয়েছে এবং Join() দিয়ে নিশ্চিত করা হয়েছে যে দুই থ্রেডের কাজ শেষ হলে পরবর্তী কোড চালাবে।

সংক্ষেপে

  • Thread ক্লাস: মাল্টিথ্রেডিং করতে ব্যবহার করা হয়।
  • Start(): থ্রেড চালু করে।
  • Sleep(): থ্রেডকে সাময়িকভাবে স্থগিত করে।
  • Join(): মেইন থ্রেডকে অপেক্ষা করানো হয় যতক্ষণ না নির্দিষ্ট থ্রেড শেষ হয়।
  • Priority: থ্রেডের প্রাধান্য নির্ধারণ করতে ব্যবহৃত।
  • lock: রিসোর্সে একাধিক থ্রেডের এক্সেস সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়।
  • Abort(): থ্রেড বন্ধ করতে ব্যবহৃত, তবে প্রায়শই এড়িয়ে চলা হয়।

সি# এ মাল্টিথ্রেডিং ব্যবহারে প্রোগ্রামের পারফরম্যান্স বাড়ানো যায় এবং একই সাথে একাধিক কাজ করা সম্ভব হয়।

 

 

Content added By

আরও দেখুন...

Promotion