-
اعتراض کی تمام حالتیں کیا ہیں
Thread
؟- نئی
- چلانے کے قابل
- مسدود
- انتظار کر رہا ہے۔
- TIMED_WAITING
- ختم کر دیا گیا
-
بلاک میں داخل ہونے پر تھریڈ کن ریاستوں میں جا سکتا ہے
synchronized
؟- چلانے کے قابل
- مسدود
RUNNABLE میں، اگر نشان زد کوڈ کے بلاک پر
synchronized
کسی اور تھریڈ کا قبضہ نہیں ہے۔ بصورت دیگر، ہمارا تھریڈ بلاک شدہ حالت حاصل کرے گا اور mutex آبجیکٹ کے جاری ہونے کا انتظار کرے گا۔ - طریقہ کو کال کرتے وقت تھریڈ کس حالت میں جائے گا
wait()
؟اس طریقہ کو کال کرنے سے تھریڈ کو انتظار کی حالت میں رکھا جاتا ہے۔
طریقہ کوwait()
صرف ایک mutex آبجیکٹ کے بلاک کے اندر ہی بلایا جا سکتا ہےsynchronized
جسے موجودہ تھریڈ کے ذریعے "لاک" کر دیا گیا ہے، بصورت دیگر یہ طریقہ ایک IllegalMonitorStateException استثناء پھینک دے گا ۔Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
جب کسی طریقہ کو کال کیا جاتا ہےwait()
، تو موجودہ تھریڈ آبجیکٹ سے لاک کو جاری کرتا ہے اور انتظار کی حالت میں داخل ہوتا ہے، کسی اور تھریڈ کے ذریعےmonitor
بلائے جانے والے طریقہ کے انتظار میں ۔ جیسے ہی ایسا ہوتا ہے، دھاگہ جاگ جائے گا اور اگر مانیٹر مصروف نہیں تھا، تو اسے پکڑ لے گا اور کام جاری رکھے گا۔ اگر مانیٹر پر کسی اور تھریڈ کا قبضہ ہے، تو موجودہ تھریڈ بلاک شدہ حالت میں چلا جائے گا۔monitor.notify()
monitor.notifyAll()
-
طریقہ کو کال کرتے وقت تھریڈ کس حالت میں جائے گا
اس طریقہ کو کال کرنا تھریڈ کو TIMED_WAITING حالت میں رکھتا ہے۔wait(500)
؟
طریقہ کے ساتھ مشابہت کے ساتھwait()
،wait(timeout)
اسے صرف ایک mutex آبجیکٹ پر موجود بلاک کے اندر بلایا جا سکتا ہےsynchronized
جسے موجودہ تھریڈ کے ذریعے "لاک (لاک)" کر دیا گیا ہے۔Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(500); … }
طریقہ کو کال کرتے وقت
wait()
، موجودہ دھاگہ آبجیکٹ سے لاک کو جاری کرتا ہےmonitor
اور 500 ملی سیکنڈ کے لیے سو جاتا ہے۔ آبجیکٹ کوmonitor
کسی اور دھاگے سے پکڑا جا سکتا ہے۔
500 ملی سیکنڈ کے بعد، تھریڈ جاگ جائے گا اور اگرmonitor
یہ مصروف نہیں تھا، تو یہ اسے پکڑ لے گا اور کام جاری رکھے گا۔
اگر مانیٹر پر کسی اور تھریڈ کا قبضہ ہے، تو موجودہ تھریڈ بلاک شدہ حالت میں چلا جائے گا۔طریقہ کو کال کرتے وقت تھریڈ کس حالت میں جائے گا
notify()
؟Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
کے بعدmonitor.wait()
، تھریڈ انتظار کی حالت میں چلا جائے گا۔notify()
کسی چیز پر دوسرے تھریڈ کے ذریعہ بلایا جانے والا طریقہmonitor
تھریڈ کو انتظار کی حالت سے رن ایبل حالت میں لے جائے گا جب تک کہ مانیٹر آبجیکٹ کو کسی اور تھریڈ کے ذریعہ پکڑا نہ جائے، بصورت دیگر بلاک شدہ حالت میں۔ -
طریقہ کو کال کرتے وقت تھریڈ کس حالت میں جائے گا
notifyAll()
؟notifyAll()
تمام تھریڈز "رہیں گے"۔ تمام "سلیپنگ" (انتظار) تھریڈز میں سے ایک رن ایبل حالت میں چلا جائے گا، استعمال ہونے والی چیز کا مانیٹر سنبھالے گا اور اپنا کام جاری رکھے گا۔ باقی بلاک شدہ حالت میں ہوں گے۔ جیسے ہی پہلا "جاگنا" تھریڈ مانیٹر کو جاری کرتا ہے، جس کا باقی سب انتظار کر رہے ہیں، اس کی قسمت اگلے تھریڈ میں دہرائی جائے گی (ایک صوابدیدی دھاگہ بلاک شدہ حالت سے چلی جانے والی حالت میں جائے گا)۔ یہ اس وقت تک جاری رہے گا جب تک کہ تمام "بیدار" تھریڈز بلاک شدہ حالت سے باہر نہ نکل جائیں۔ -
سنکرونائزڈ بلاک میں تین تھریڈز جنہیں
ان میں سے دو بلاک شدہ حالت میں جائیں گے، ایک بھاگنے والی حالت میںwait()
mutex آبجیکٹ کہتے ہیں۔ اگر چوتھا تھریڈ کال کرتا ہے تو یہ تھریڈ کس حالت میں جائیں گےnotifyAll()
؟ -
اس حقیقت کے باوجود کہ اور موجودہ تھریڈ کو TIMED_WAITING حالت میں منتقلjoin(500)
سے کیسے مختلف ہےwait(500)
؟join(500)
کرے گا ، ان کے درمیان اہم فرق ہیں: تھریڈ پر بلایا جاتا ہے، جس چیز پر یہ بلاک مطابقت پذیر ہوتا ہے اس پر ایک مطابقت پذیر بلاک کے اندر بلایا جاتا ہے۔ کال کرنے پر، موجودہ تھریڈ اس تھریڈ کے لیے 500 ملی سیکنڈ انتظار کرے گا جس کا طریقہ مکمل کرنے کے لیے بلایا گیا تھا۔ کال کرنے پر، موجودہ دھاگہ مطابقت پذیر آبجیکٹ سے لاک کو چھوڑ دے گا اور 500 ملی سیکنڈ کے لیے سو جائے گا۔ 500 ملی سیکنڈ کے بعد، دونوں صورتوں میں تھریڈز کام کرتے رہیں گے۔wait(500)
join(500)
wait(500)
join(500)
join()
wait(500)
-
wait(500)
سے کیسے مختلف ہےsleep(500)
؟sleep(500)
ایک دھاگے پر بلایا جاتا ہے،wait(500)
جس چیز پر یہ بلاک مطابقت پذیر ہوتا ہے اس پر ایک مطابقت پذیر بلاک کے اندر بلایا جاتا ہے۔
کال کرنے پر،sleep(500)
موجودہ تھریڈ 500 ملی سیکنڈ انتظار کرے گا، پھر اپنا کام جاری رکھے گا۔
کال کرنے پر،wait(500)
موجودہ دھاگہ مطابقت پذیر آبجیکٹ سے لاک کو جاری کر دے گا اور 500 ملی سیکنڈ کے لیے سو جائے گا۔ -
طریقہ کو کال کرتے وقت تھریڈ کس حالت میں جائے گا
جب ایک طریقہ کہا جاتا ہےyield()
؟yield()
، موجودہ تھریڈ "اپنی باری چھوڑ دیتا ہے" اور جاوا فوری طور پر اگلے تھریڈ پر عمل کرنے کے لیے سوئچ کرتا ہے۔ دھاگہ ریاست سےrunning
ریاست تک جاتا ہےready
۔ چلتی اور تیار ریاستیں چلنے والی ریاست کی ذیلی ریاستیں ہیں۔
GO TO FULL VERSION