ההבדל בין המתנה לשינה בג'אווה

1. סקירה כללית

במאמר קצר זה נבחן את התקן לִישׁוֹן() ו לַחֲכוֹת() שיטות בליבה של Java, ולהבין את ההבדלים והדמיון ביניהם.

2. ההבדלים הכלליים בין לַחֲכוֹת ו לִישׁוֹן

פשוט שים, לַחֲכוֹת() היא שיטת מופע המשמשת לסנכרון חוטים.

ניתן לקרוא לזה על כל אובייקט, כפי שהוא מוגדר ממש java.lang. אובייקט, אבל זה יכול להתקשר רק מחסימה מסונכרנת. זה משחרר את המנעול על האובייקט כך שחוט אחר יכול לקפוץ פנימה ולרכוש מנעול.

מצד שני, Thread.sleep () היא שיטה סטטית שאפשר לקרוא לה מכל הקשר.Thread.sleep () מושהה את השרשור הנוכחי ולא משחרר שום נעילה.

הנה מבט ראשוני מאוד פשטני על שני ממשקי ה- API העיקריים האלה בפעולה:

אובייקט סטטי פרטי LOCK = אובייקט חדש (); חלל סטטי פרטי sleepWaitExamples () זורק InterruptedException {Thread.sleep (1000); System.out.println ("Thread '" + Thread.currentThread (). GetName () + "' מתעורר לאחר שינה של שנייה אחת"); מסונכרן (LOCK) {LOCK.wait (1000); System.out.println ("אובייקט" + LOCK + "'מתעורר לאחר" + "ממתין לשנייה אחת"); }} 

הפעלת דוגמה זו תפיק את הפלט הבא:

החוט 'ראשי' מתעורר לאחר שינה של שנייה אחת

האובייקט '[מוגן באמצעות הדוא"ל]' מתעורר לאחר המתנה לשנייה אחת

3. להתעורר לַחֲכוֹת ו לִישׁוֹן

כאשר אנו משתמשים ב- לִישׁוֹן() בשיטה, שרשור מתחיל לאחר מרווח זמן מוגדר, אלא אם כן הוא מופרע.

ל לַחֲכוֹת(), תהליך ההשכמה הוא קצת יותר מסובך. אנו יכולים להעיר את החוט על ידי קריאה ל- לְהוֹדִיעַ() אוֹ notifyAll () שיטות בצג שממתינים עליו.

להשתמש notifyAll () במקום לְהוֹדִיעַ() כאשר אתה רוצה להעיר את כל הנושאים הנמצאים במצב המתנה. בדומה ל לַחֲכוֹת() השיטה עצמה, לְהוֹדִיעַ(), ו notifyAll () צריך להתקשר מההקשר המסונכרן.

לדוגמה, כך תוכלו לעשות זאת לַחֲכוֹת:

מסונכרן (b) {while (b.sum == 0) {System.out.println ("מחכה להשלמת ThreadB ..."); חכה (); } System.out.println ("ThreadB הושלם." + "הסכום מאותו שרשור הוא:" + b.sum); }

ואז, הנה איך פתיל אחר יכול אז להעיר את חוט ההמתנה - על ידי התקשרות לְהוֹדִיעַ() על הצג:

סכום אינט; @ עקוף ריצת חלל ציבורית () {מסונכרנת (זו) {int i = 0; ואילו (i <100000) {sum + = i; i ++; } להודיע ​​(); }}

הפעלת דוגמה זו תפיק את הפלט הבא:

ממתין להשלמת ThreadB ...

ThreadB הושלם. סְכוּם מהחוט הזה הוא: 704982704

4. מסקנה

זהו תחל מהיר לסמנטיקה של לַחֲכוֹת ו לִישׁוֹן בג'אווה.

באופן כללי, עלינו להשתמש לִישׁוֹן() לבקרת זמן הביצוע של שרשור אחד ו- לַחֲכוֹת() לסינכרון רב חוטים. מטבע הדברים, יש עוד הרבה מה לחקור - לאחר הבנת היסודות היטב.

כמו תמיד, תוכל לבדוק את הדוגמאות המופיעות במאמר זה ב- GitHub.