JavaRush /בלוג Java /Random-HE /רמה 25. תשובות לשאלות ראיון בנושא הרמה
zor07
רָמָה
Санкт-Петербург

רמה 25. תשובות לשאלות ראיון בנושא הרמה

פורסם בקבוצה
רמה 25. תשובות לשאלות ראיון בנושא רמה - 1
  1. מהם כל המצבים של האובייקט Thread?

    • חָדָשׁ
    • ניתן להרצה
    • חָסוּם
    • הַמתָנָה
    • TIMED_WAITING
    • נסגר
  2. לאילו מצבים שרשור יכול להגיע בעת כניסה לחסימה synchronized?

    • ניתן להרצה
    • חָסוּם

    ב-RUNNABLE, אם גוש הקוד המסומן synchronizedאינו תפוס על ידי שרשור אחר. אחרת, השרשור שלנו יקבל את המצב BLOCKED ויחכה לשחרור אובייקט המוטקס.

  3. לאיזה מצב יעבור השרשור בעת קריאת השיטה wait()?

    קריאה לשיטה זו ממקמת את השרשור במצב WAITING. ניתן לקרוא
    לשיטה רק בתוך בלוק על אובייקט mutex ש"ננעל" על ידי השרשור הנוכחי, אחרת השיטה תזרוק חריג IllegalMonitorStateException .wait()synchronized

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    כאשר מתודה נקראת wait(), השרשור הנוכחי משחרר את המנעול מהאובייקט monitorונכנס למצב WAITING, ממתין שהשיטה תיקרא monitor.notify()על ידי monitor.notifyAll()שרשור אחר. ברגע שזה יקרה, השרשור יתעורר ואם המוניטור לא היה תפוס, הוא יתפוס אותו וימשיך לעבוד.
    אם הצג תפוס על ידי שרשור אחר, השרשור הנוכחי יעבור למצב חסום.

  4. לאיזה מצב יעבור השרשור בעת קריאת השיטה wait(500)?

    קריאה לשיטה זו ממקמת את השרשור במצב TIMED_WAITING.
    באנלוגיה לשיטה 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 אלא אם אובייקט המוניטור נלכד על ידי שרשור אחר, אחרת למצב חסום.

  5. לאיזה מצב יעבור השרשור בעת קריאת השיטה notifyAll()?

    notifyAll()"יישאר" בכל השרשורים. אחד מכל השרשורים ה"ישנים" (WAITING) יעבור למצב RUNNABLE, ישתלט על המוניטור של האובייקט בשימוש וימשיך בעבודתו. השאר יהיו במצב חסום. ברגע שהשרשור הראשון של "התעוררות" ישחרר את המוניטור, שכולם מחכים לו, גורלו יחזור על ידי השרשור הבא (שרשור שרירותי יעבור ממצב BLOCKED למצב RUNNABLE). זה יימשך עד שכל האשכולות "התעוררו" יעזבו את המצב חסום.

  6. שלושה חוטים בבלוק המסונכרן שנקרא wait()אובייקט mutex. לאיזה מצב השרשורים האלה יעברו אם השרשור הרביעי יתקשר notifyAll()?

    שניים מהם יעברו למצב חסום, אחד למצב RUNABLE

  7. במה זה שונה join(500)מ wait(500)?

    למרות העובדה כי join(500)ויעביר wait(500)את השרשור הנוכחי למצב TIMED_WAITING, ישנם הבדלים משמעותיים ביניהם:
    join(500)נקרא על שרשור, wait(500)נקרא בתוך בלוק מסונכרן באובייקט עליו מסונכרן הבלוק הזה.
    כשנקרא, join(500)השרשור הנוכחי ימתין 500 אלפיות שניות עד join()להשלמת השרשור שהשיטה שלו נקראה.
    כשיקרא, wait(500)השרשור הנוכחי ישחרר את הנעילה מהאובייקט המסונכרן וילך לישון למשך 500 אלפיות השנייה.
    לאחר 500 אלפיות השנייה, בשני המקרים החוטים ימשיכו לעבוד.

  8. במה זה שונה wait(500)מ sleep(500)?

    sleep(500)נקרא על פתיל, wait(500)שנקרא בתוך בלוק מסונכרן על האובייקט עליו מסונכרן הבלוק הזה.
    כשיקרא, sleep(500)השרשור הנוכחי ימתין 500 אלפיות שניות, ואז ימשיך בעבודתו.
    כשיקרא, wait(500)השרשור הנוכחי ישחרר את הנעילה מהאובייקט המסונכרן וילך לישון למשך 500 אלפיות השנייה.

  9. לאיזה מצב יעבור השרשור בעת קריאת השיטה yield()?

    כשמתודה נקראת yield(), השרשור הנוכחי "מדלג על התור שלו" ו-java עובר מיד לביצוע השרשור הבא. השרשור עובר ממדינה runningלמדינה ready. מצבי הריצה והמוכנים הם תת-מצבים של המצב RUNNABLE.

נ.ב הערות, תוספות, תיקונים, הערות יתקבלו בברכה =)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION