-
ما هي جميع حالات الكائن
Thread
؟- جديد
- قابل للتشغيل
- محظور
- منتظر
- في انتظار الوقت
- تم الإنهاء
-
ما الحالات التي يمكن أن ينتقل إليها الخيط عند إدخال الكتلة
synchronized
؟- قابل للتشغيل
- محظور
في RUNNABLE، إذا كانت كتلة التعليمات البرمجية المحددة
synchronized
غير مشغولة بمؤشر ترابط آخر. بخلاف ذلك، سيتلقى مؤشر الترابط الخاص بنا حالة الحظر وسينتظر حتى يتم تحرير كائن المزامنة. - ما الحالة التي سينتقل إليها الخيط عند استدعاء الطريقة
wait()
؟يؤدي استدعاء هذه الطريقة إلى وضع مؤشر الترابط في حالة الانتظار.
لا يمكن استدعاء الطريقةwait()
إلا داخل كتلةsynchronized
على كائن كائن المزامنة "mutex" الذي تم "تأمينه" بواسطة مؤشر الترابط الحالي، وإلا ستطرح الطريقة استثناء IllegalMonitorStateException .Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
عندما يتم استدعاء طريقة ماwait()
، يقوم الخيط الحالي بتحرير القفل من الكائنmonitor
ويدخل في حالة الانتظار، في انتظار استدعاء الطريقةmonitor.notify()
بواسطةmonitor.notifyAll()
مؤشر ترابط آخر. بمجرد حدوث ذلك، سوف يستيقظ الخيط وإذا لم تكن الشاشة مشغولة، فسوف يلتقطها ويستمر في العمل.
إذا كانت الشاشة مشغولة بخيط آخر، فسينتقل الخيط الحالي إلى حالة الحظر. -
ما الحالة التي سينتقل إليها الخيط عند استدعاء الطريقة
يؤدي استدعاء هذه الطريقة إلى وضع مؤشر الترابط في حالة TIMED_WAITING.wait(500)
؟
قياسًا على الطريقةwait()
،wait(timeout)
لا يمكن استدعاؤها إلا داخل كتلةsynchronized
على كائن كائن المزامنة (mutex) الذي تم "تأمينه (تأمينه)" بواسطة الخيط الحالي.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()
؟ -
كيف يختلف
على الرغم من حقيقة أنهjoin(500)
عنwait(500)
؟join(500)
سيتمwait(500)
نقل مؤشر الترابط الحالي إلى حالة TIMED_WAITING، إلا أن هناك اختلافات كبيرة بينهما:join(500)
يتم استدعاؤها على مؤشر ترابط،wait(500)
ويتم استدعاؤها داخل كتلة متزامنة على الكائن الذي تتم مزامنة هذه الكتلة عليه.
عند الاتصال،join(500)
سينتظر الخيط الحالي 500 مللي ثانية حتىjoin()
يكتمل الخيط الذي تم استدعاء طريقته.
عند الاتصال،wait(500)
سيحرر الخيط الحالي القفل من الكائن المتزامن ويدخل في وضع السكون لمدة 500 مللي ثانية.
وبعد مرور 500 مللي ثانية، في كلتا الحالتين ستستمر الخيوط في العمل. -
كيف يختلف
wait(500)
عنsleep(500)
؟sleep(500)
يتم استدعاؤه على مؤشر ترابط،wait(500)
ويتم استدعاؤه داخل كتلة متزامنة على الكائن الذي تتم مزامنة هذه الكتلة عليه.
عند الاتصال،sleep(500)
سينتظر الخيط الحالي 500 مللي ثانية، ثم يواصل عمله.
عند الاتصال،wait(500)
سيحرر الخيط الحالي القفل من الكائن المتزامن ويدخل في وضع السكون لمدة 500 مللي ثانية. -
ما الحالة التي سينتقل إليها الخيط عند استدعاء الطريقة
عندما يتم استدعاء الأسلوبyield()
؟yield()
، فإن الخيط الحالي "يتخطى دوره" وتتحول Java على الفور إلى تنفيذ الخيط التالي. الخيط ينتقل من دولةrunning
إلى أخرىready
. حالات التشغيل والجاهزية هي حالات فرعية للحالة RUNNABLE.
GO TO FULL VERSION