اس آرٹیکل میں، ہم تھریڈ کو کنٹرول کرنے کے لیے wait() طریقہ اور notify() / notifyAll() طریقوں کو دیکھیں گے ۔ ان طریقوں کو بیس کلاس java.lang.Object میں بیان کیا گیا ہے اور اس کے مطابق، وراثت کے طریقہ کار جو جاوا میں ہیں، بالکل تمام کلاسوں کو یہ طریقے فراہم کرتے ہیں۔ یعنی، جب آپ اپنی کلاس اور اس کی اشیاء بناتے ہیں، تو آپ ان طریقوں کو ہمیشہ کال کر سکتے ہیں۔
wait() اور notify()/notifyAll() طریقے کیسے کام کرتے ہیں؟
- انتظار کریں() ۔ مختصراً، یہ طریقہ مانیٹر کو جاری کرتا ہے اور کالنگ تھریڈ کو انتظار کی حالت میں رکھتا ہے جب تک کہ کوئی دوسرا تھریڈ notify() / notifyAll() طریقہ کو کال نہ کرے۔
- مطلع() . ایک تھریڈ کا کام جاری رکھتا ہے جس کا انتظار() طریقہ پہلے کہا جاتا تھا۔
- notifyAll() طریقہ ان تمام دھاگوں کو دوبارہ شروع کرتا ہے جن کا پہلے انتظار() طریقہ کال کیا گیا تھا۔
-
عوامی حتمی مقامی باطل انتظار (طویل ٹائم آؤٹ ملیس) نے InterruptedException پھینک دیا ۔ یہ موجودہ تھریڈ کے بیدار ہونے تک انتظار کرنے کا سبب بنتا ہے۔ عام طور پر یہ مطلع ہونے یا مداخلت کرنے سے ہوتا ہے، یا جب تک کہ حقیقی وقت کی ایک خاص مقدار گزر نہ جائے۔
-
عوامی حتمی باطل انتظار() InterruptedException پھینک دیتا ہے ۔ یہ کوئی اتفاق نہیں ہے کہ ہم نے پیرامیٹرز کے بغیر دوسرا طریقہ لکھا ہے۔ درحقیقت، اگر آپ اس کے کوڈ پر نظر ڈالیں، تو اس سے مراد طریقہ کی پہلی قسم ہے، اس میں صرف 0L دلیل ہے۔
-
عوامی حتمی انتظار (لمبی مدت، int nanos) ۔ موجودہ تھریڈ کو بیدار ہونے تک انتظار کرنے کا سبب بنتا ہے، عام طور پر مطلع یا مداخلت کرکے، یا جب تک کہ حقیقی وقت کی ایک خاص مقدار گزر نہ جائے۔
Wait() طریقہ مثال
یہاں ہمارے پاس سب سے مشہور مثالوں میں سے ایک ہے جو یہ بتاتی ہے کہ طریقہ کیسے کام کرتا ہے۔ ہم کہتے ہیں کہ ہمارے پاس ایک اسٹور، ایک پروڈیوسر، اور ایک صارف ہے۔ کارخانہ دار پیداوار کی کچھ مصنوعات کو اسٹور میں منتقل کرتا ہے، جس کے بعد صارف انہیں لے سکتا ہے۔ مینوفیکچرر کو بالترتیب 8 سامان تیار کرنے دیں، صارفین کو ان سب کو خریدنا چاہیے۔ لیکن ایک ہی وقت میں گودام میں ایک ہی وقت میں 6 سے زیادہ اشیاء نہیں رکھ سکتے۔ اس مسئلے کو حل کرنے کے لیے، ہم wait() اور notify() طریقے استعمال کرتے ہیں۔ آئیے تین طبقات کی وضاحت کرتے ہیں: مارکیٹ ، مینوفیکچرر اور کلائنٹ ۔ رن() طریقہ کار میں مینوفیکچرر اپنے put() طریقہ استعمال کرتے ہوئے مارکیٹ آبجیکٹ میں 8 مصنوعات شامل کرتا ہے ۔ لوپ میں رن() طریقہ میں کلائنٹ ان مصنوعات کو حاصل کرنے کے لیے مارکیٹ آبجیکٹ کے گیٹ میتھڈ کو کال کرتا ہے۔ مارکیٹ کلاس کے پٹ اور حاصل کرنے کے طریقے ہم آہنگ ہوتے ہیں۔ مارکیٹ کلاس میں سامان کی موجودگی کو ٹریک کرنے کے لیے ، ہم آئٹم متغیر کی قدر کو چیک کرتے ہیں۔ پروڈکٹ حاصل کرنے کے لیے get() طریقہ صرف اس صورت میں فائر ہونا چاہیے جب کم از کم ایک پروڈکٹ ہو ۔ لہذا، حاصل کرنے کے طریقہ کار میں، ہم چیک کرتے ہیں کہ آیا پروڈکٹ غائب ہے۔ اگر آئٹم دستیاب نہیں ہے تو انتظار() طریقہ کہا جاتا ہے۔ یہ طریقہ مارکیٹ آبجیکٹ کے مانیٹر کو جاری کرتا ہے اور گیٹ میتھڈ کو بلاک کرتا ہے جب تک کہ نوٹیفائی() طریقہ اسی مانیٹر پر کال نہ کیا جائے۔ جب کسی آئٹم کو put() طریقہ میں شامل کیا جاتا ہے اور notify() کہا جاتا ہے تو get() طریقہ مانیٹر حاصل کرتا ہے۔ اس کے بعد، ہمارے کلائنٹ کو ایک شے موصول ہوتی ہے۔ ایسا کرنے کے لیے، ایک پیغام ظاہر ہوتا ہے، اور شے کی قدر میں کمی واقع ہوتی ہے۔ آخر میں، notify() میتھڈ کال جاری رکھنے کے لیے put() طریقہ کا اشارہ دیتی ہے۔ put() طریقہ کار میں ، اسی طرح کی منطق کام کرتی ہے، اب صرف put() طریقہ کام کرے گا اگر مارکیٹ میں 6 سے زیادہ مصنوعات نہ ہوں ۔class Market {
private int item = 0;
public synchronized void get() {
//here we use wait() method
while (item < 1) {
try {
wait();
}
catch (InterruptedException e) {
}
}
item--;
System.out.println("A client has bought 1 item...");
System.out.println("Items quantity in Market warehouse... " + item);
notify();
}
public synchronized void put() {
//here we use wait() method when the Warehouse is full
while (item >= 6) {
try {
wait();
}
catch (InterruptedException e) {
}
}
item ++;
System.out.println("Manufacturer has added 1 more item...");
System.out.println("Now there are " + item + " items in Warehouse" );
notify();
}
}
class Manufacturer implements Runnable {
Market market;
Manufacturer(Market market) {
this.market = market;
}
public void run() {
for (int i = 0; i < 8; i++) {
market.put();
}
}
}
class Client implements Runnable {
Market market;
Client(Market market) {
this.market = market;
}
public void run() {
for (int i = 0; i < 8; i++) {
market.get();
}
}
}
//wait() method test class
public class WaitTest {
public static void main(String[] args) {
Market market = new Market();
Manufacturer manufacturer = new Manufacturer(market);
Client client = new Client(market);
new Thread(manufacturer).start();
new Thread(client).start();
}
}
یہاں، get() طریقہ میں wait() کا استعمال کرتے ہوئے ، ہم مینوفیکچرر کی جانب سے ایک نئی چیز شامل کرنے کا انتظار کر رہے ہیں۔ اور شامل کرنے کے بعد، ہم نوٹیفائی() کو کال کرتے ہیں ، گویا یہ کہنا کہ گودام پر ایک جگہ مفت ہو گئی ہے ، اور آپ مزید اضافہ کر سکتے ہیں۔ put() طریقہ میں ، wait() کا استعمال کرتے ہوئے، ہم Warehouse پر جگہ کے اجراء کا انتظار کر رہے ہیں ۔ جگہ خالی ہونے کے بعد، ہم آئٹم کو شامل کرتے ہیں، notify() تھریڈ شروع ہوتا ہے اور کلائنٹ اس چیز کو اٹھا سکتا ہے۔ ہمارے پروگرام کا آؤٹ پٹ یہ ہے:
مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 1 آئٹم ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 2 آئٹمز ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام مینوفیکچرر میں 3 آئٹمز ہیں 1 مزید آئٹم شامل کیا گیا... اب گودام میں 4 آئٹمز ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 5 آئٹمز ہیں مینوفیکچرر نے 1 مزید آئٹم شامل کیا ہے... اب گودام میں 6 آئٹمز ہیں ایک کلائنٹ نے خریدا ہے 1 آئٹم... مارکیٹ کے گودام میں اشیاء کی مقدار... 5 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 4 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 3 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 2 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 1 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار ... 0 مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 1 آئٹم ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 2 آئٹمز ہیں ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار ... 1 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 0 ایگزٹ کوڈ کے ساتھ عمل مکمل ہو گیا 0
GO TO FULL VERSION