"হ্যালো, অ্যামিগো! এলি আপনাকে থ্রেড সম্পর্কে বলেছে, এবং আমি আপনাকে বলতে যাচ্ছি আপনি কীভাবে তাদের সাথে কাজ করবেন। একটি নতুন থ্রেড তৈরি করতে, আপনাকে এটি করতে হবে:"

1)  একটি থ্রেড অবজেক্ট তৈরি করুন

2) আপনি যে পদ্ধতিটি চালাতে চান সেটি পাস করুন

3)  তৈরি থ্রেড অবজেক্টে স্টার্ট মেথড কল করুন।

এই উদাহরণ বিবেচনা করুন:

কোড বর্ণনা
class Printer implements Runnable
{
public void run()
{
System.out.println("I’m printer");
}
}
ক্লাস যা রানেবল ইন্টারফেস প্রয়োগ করে।
public static void main(String[] args)
{
Printer printer = new Printer();
Thread childThread = new Thread(printer);
childThread.start();
}
1 প্রিন্টার ক্লাসের একটি উদাহরণ তৈরি করুন, যা রান পদ্ধতি প্রয়োগ করে।
2 একটি নতুন থ্রেড অবজেক্ট তৈরি করুন। আমরা কনস্ট্রাক্টরকে প্রিন্টার অবজেক্ট পাস করি, যার রান() পদ্ধতিটি চালু করতে হবে। 3 start()
পদ্ধতিতে কল করে নতুন থ্রেড শুরু করুন ।

ছোট জাভা প্রোগ্রামে সাধারণত একটি থ্রেড থাকে যাকে "প্রধান থ্রেড" বলা হয়। তবে প্রোগ্রামগুলি প্রায়শই অতিরিক্ত থ্রেড চালু করে, যাকে "শিশু থ্রেড" বলা হয়। প্রধান থ্রেড প্রধান পদ্ধতি চালায় এবং শেষ হয়। রানেবলের রান পদ্ধতি হল চাইল্ড থ্রেডের জন্য সাদৃশ্যপূর্ণ পদ্ধতি।

"আহ, প্রচুর থ্রেড মানে অনেক প্রধান পদ্ধতি।"

নতুন থ্রেড তৈরি এবং শুরু করা - 1

একটি থ্রেড অবজেক্টকে কোন নির্দিষ্ট পদ্ধতিতে এটি শুরু করা উচিত তা বলতে, আমাদের এটিতে একটি পদ্ধতি পাস করতে হবে। জাভাতে, এটি রানেবল ইন্টারফেস ব্যবহার করে করা হয়। এই ইন্টারফেসে একটি একক বিমূর্ত পদ্ধতি রয়েছে: void run() । থ্রেড ক্লাসে একটি থ্রেড (চালাতে যোগ্য) কনস্ট্রাক্টর রয়েছে। আপনি যেকোন অবজেক্টে পাস করতে পারেন যা রানেবল ইন্টারফেস প্রয়োগ করে।

আপনার ক্লাস অবশ্যই রানেবলের উত্তরাধিকারী হবে এবং এর রান পদ্ধতি ওভাররাইড করবে। এই পদ্ধতি চালু করাই নতুন থ্রেড শুরু করে। আপনি রান পদ্ধতিতে যা খুশি লিখতে পারেন ।

কোড বর্ণনা
class Printer implements Runnable
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
ক্লাস যা রানেবল ইন্টারফেস প্রয়োগ করে।
public static void main(String[] args)
{
Printer printer1 = new Printer("Nick");
Thread thread1 = new Thread(printer1);
thread1.start();

Printer printer2 = new Printer("Jack");
Thread thread2 = new Thread(printer2);
thread2.start();
}
দুটি থ্রেড তৈরি করুন, যার প্রতিটি তার নিজস্ব প্রিন্টার অবজেক্টের উপর ভিত্তি করে তৈরি হবে।
public static void main(String[] args)
{
Printer printer = new Printer("Natasha");

Thread thread1 = new Thread(printer);
thread1.start();

Thread thread2 = new Thread(printer);
thread2.start();

Thread thread3 = new Thread(printer);
thread3.start();
}
একটি একক প্রিন্টার অবজেক্টের উপর ভিত্তি করে তিনটি থ্রেড তৈরি করুন।

আরো কি, আপনি এই সব একটি ক্লাসে একত্রিত করতে পারেন. থ্রেড ক্লাস রানেবল ইন্টারফেসটি উত্তরাধিকার সূত্রে প্রাপ্ত , তাই আপনাকে শুধুমাত্র এটির রান পদ্ধতি ওভাররাইড করতে হবে:

একটি নতুন থ্রেড তৈরি করার আরেকটি উপায়
class Printer extends Thread
{
private String name;
public Printer(String name)
{
this.name = name;
}
public void run()
{
System.out.println("I’m " + this.name);
}
}
থ্রেড ক্লাস ইনহেরিট করুন , যা রানেবল ইন্টারফেস প্রয়োগ করে এবং তারপর রান পদ্ধতি ওভাররাইড করে।
public static void main(String[] args)
{
Printer printer = new Printer("Jack");
printer.start();

Printer printer2 = new Printer("Jack");
printer2.start();

}
দুটি থ্রেড তৈরি করুন, যার প্রতিটি তার নিজস্ব প্রিন্টার অবজেক্টের উপর ভিত্তি করে তৈরি হবে।

"এটি একটি আরো মার্জিত সমাধান।"

"হ্যাঁ, তবে এর ত্রুটি রয়েছে:"

1)  আপনাকে একটি একক বস্তুর উপর ভিত্তি করে বেশ কয়েকটি থ্রেড শুরু করতে হতে পারে, যেমন নাতাশার উদাহরণে।

2)  আপনি যদি থ্রেড ক্লাস থেকে উত্তরাধিকারী হন তবে আপনি আপনার ক্লাসে অন্য অভিভাবক শ্রেণী যোগ করতে পারবেন না।

3)  যদি আপনার ক্লাসের একটি অভিভাবক শ্রেণী থাকে, তাহলে আপনি দ্বিতীয় অভিভাবক শ্রেণী হিসাবে থ্রেড যোগ করতে পারবেন না।

"অন্য কথায়, স্টার্ট মেথড কল করার পর, প্রতিটি থ্রেড কনস্ট্রাক্টরের কাছে পাঠানো অবজেক্টের রান মেথড এক্সিকিউট করা শুরু করে?"

"হ্যাঁ। যদি কনস্ট্রাক্টরকে কিছু না দেওয়া হয়, তাহলে থ্রেড তার অভ্যন্তরীণ রান পদ্ধতি চালায়।"

"কিন্তু কেন আমরা শুধু এই পদ্ধতিটিকে কল করি না?"

কোড
public static void main(String[] args)
{
 Printer printer1 = new Printer("Nick");
 printer1.run();
}

"যখন মূল থ্রেড রান পদ্ধতিতে পৌঁছায়, তখন এর "ছোট রোবট" কেবল ভিতরে যায় এবং এর ভিতরের সমস্ত কমান্ড কার্যকর করে। শুধুমাত্র সেগুলি কার্যকর করার পরে এটি মূল পদ্ধতিতে ফিরে আসবে এবং পরবর্তী কমান্ডগুলি চালানো চালিয়ে যাবে। এইভাবে, কোন সেকেন্ড নয় " ছোট রোবট" তৈরি করা হবে। সমস্ত কাজ ক্রমানুসারে করা হবে, সমান্তরালে (একযোগে) নয়।"

"আমি দেখছি। আপনি কি অন্য কোন পদ্ধতি বলতে পারেন, চালানো ছাড়া অন্য কিছু?"

"না। এটি সবই রানেবল ইন্টারফেসের সাথে আবদ্ধ, যা শুধুমাত্র তার একটি পদ্ধতি সম্পর্কে "জানে": run() ।"