-
מהם כל המצבים של האובייקט
Thread
?- חָדָשׁ
- ניתן להרצה
- חָסוּם
- הַמתָנָה
- TIMED_WAITING
- נסגר
-
לאילו מצבים שרשור יכול להגיע בעת כניסה לחסימה
synchronized
?- ניתן להרצה
- חָסוּם
ב-RUNNABLE, אם גוש הקוד המסומן
synchronized
אינו תפוס על ידי שרשור אחר. אחרת, השרשור שלנו יקבל את המצב BLOCKED ויחכה לשחרור אובייקט המוטקס. - לאיזה מצב יעבור השרשור בעת קריאת השיטה
wait()
?קריאה לשיטה זו ממקמת את השרשור במצב WAITING. ניתן לקרוא
לשיטה רק בתוך בלוק על אובייקט mutex ש"ננעל" על ידי השרשור הנוכחי, אחרת השיטה תזרוק חריג IllegalMonitorStateException .wait()
synchronized
Object monitor = getMonitor(); synchronized(monitor) { … monitor.wait(); … }
כאשר מתודה נקראתwait()
, השרשור הנוכחי משחרר את המנעול מהאובייקטmonitor
ונכנס למצב WAITING, ממתין שהשיטה תיקרא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()
, השרשור יעבור למצב WAITING. שיטהnotify()
שנקראת על ידי שרשור אחר על אובייקטmonitor
תעביר את השרשור ממצב WAITING למצב RUNNABLE אלא אם אובייקט המוניטור נלכד על ידי שרשור אחר, אחרת למצב חסום. -
לאיזה מצב יעבור השרשור בעת קריאת השיטה
notifyAll()
?notifyAll()
"יישאר" בכל השרשורים. אחד מכל השרשורים ה"ישנים" (WAITING) יעבור למצב RUNNABLE, ישתלט על המוניטור של האובייקט בשימוש וימשיך בעבודתו. השאר יהיו במצב חסום. ברגע שהשרשור הראשון של "התעוררות" ישחרר את המוניטור, שכולם מחכים לו, גורלו יחזור על ידי השרשור הבא (שרשור שרירותי יעבור ממצב BLOCKED למצב RUNNABLE). זה יימשך עד שכל האשכולות "התעוררו" יעזבו את המצב חסום. -
שלושה חוטים בבלוק המסונכרן שנקרא
שניים מהם יעברו למצב חסום, אחד למצב RUNABLEwait()
אובייקט 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