מבוא קצר ל- Java Thread.yield ()

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

במדריך זה נחקור את השיטה תְשׁוּאָה() ב פְּתִיל מעמד.

נשווה אותו עם ניבים מקבילים אחרים הקיימים ב- Java ובסופו של דבר נחקור את היישומים המעשיים של זה.

2. תקציר של תְשׁוּאָה()

כפי שמציע התיעוד הרשמי, תְשׁוּאָה() מספק מנגנון להודיע ​​ל"מתזמן "על כך השרשור הנוכחי מוכן לוותר על השימוש הנוכחי שלו במעבד אך הוא מעוניין שתוזמן חזרה בהקדם האפשרי.

"המתזמן" חופשי לדבוק במידע זה או להתעלם ממנו ולמעשה, יש לו התנהגות משתנה בהתאם למערכת ההפעלה.

קטע הקוד הבא מציג שני שרשורים בעדיפות זהה המניבים לאחר כל לוח זמנים:

class class ThreadYield {public static void main (String [] args) {Runnable r = () -> {int counter = 0; בעוד (מונה <2) {System.out.println (Thread.currentThread () .getName ()); מונה ++; Thread.yield (); }}; שרשור חדש (r) .start (); שרשור חדש (r) .start (); }}

כאשר אנו מנסים להריץ את התוכנית לעיל מספר רב של פעמים, אנו מקבלים תוצאות שונות; חלקם מוזכרים להלן:

ריצה 1:

חוט -0 חוט -1 חוט -1 חוט -0

ריצה 2:

חוט -0 חוט -0 חוט -1 חוט -1

אז כפי שאתה יכול לראות את ההתנהגות של תְשׁוּאָה() אינו דטרמיניסטי ותלוי גם בפלטפורמה.

3. השוואה עם ניבים אחרים

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

בואו נראה איך הם משתווים ל תְשׁוּאָה().

3.1. תְשׁוּאָה() לעומת לַחֲכוֹת()

  • בזמן תְשׁוּאָה() מופעל בהקשר לשרשור הנוכחי, לַחֲכוֹת() ניתן להפעיל רק על מנעול שנרכש במפורש בתוך בלוק או שיטה מסונכרנת
  • בניגוד תְשׁוּאָה(), אפשר לחכות() כדי לציין פרק זמן מינימלי לחכות לפני כל ניסיון לתזמן את השרשור מחדש
  • עם לַחֲכוֹת() אפשר גם להעיר את החוט בכל עת באמצעות קריאה של לְהוֹדִיעַ() אוֹ notifyAll () על חפץ המנעול המודאג

3.2. תְשׁוּאָה() לעומת לִישׁוֹן()

  • בזמן תְשׁוּאָה() יכול לעשות רק ניסיון היוריסטי להשעות את ביצוע החוט הנוכחי ללא אחריות מתי הוא יוזמן חזרה, לִישׁוֹן() יכול לאלץ את המתזמן להשעות את ביצוע השרשור הנוכחי לפרק הזמן המוזכר לפחות כפרמטר שלו.

3.3. תְשׁוּאָה() לעומת לְהִצְטַרֵף()

  • החוט הנוכחי יכול להפעיל לְהִצְטַרֵף() על כל חוט אחר שגורם לשרשור הנוכחי להמתין לשרשור השני למות לפני שתמשיך
  • באופן אופציונלי הוא יכול להזכיר פרק זמן כפרמטר שלו המציין את הזמן המקסימלי לו אמור להמתין השרשור הנוכחי לפני חידושו

4. שימוש עבור תְשׁוּאָה()

כפי שמציע התיעוד הרשמי, לעתים רחוקות יש צורך להשתמש בו תְשׁוּאָה() ומכאן שיש להימנע אלא אם כן ברור מאוד עם היעדים לאור התנהגותו.

עם זאת, חלק מהשימוש ב תְשׁוּאָה() כוללים תכנון מבני בקרת מקבילים, שיפור היענות המערכת בתכנית כבדת מחשבים וכו '.

עם זאת, השימושים הללו חייבים להיות מלווים בפרופילים ומידודים מפורטים כדי להבטיח את התוצאה הרצויה.

5. מסקנה

במאמר קצר זה דנו ב תְשׁוּאָה() שיטה ב פְּתִיל בכיתה וראה את התנהגותה ומגבלותיה באמצעות שבר קוד.

בדקנו גם את ההשוואה בהשוואה למילים אחרות במקביל הזמינות ב- Java ולבסוף הסתכלנו על כמה ממקרי השימוש שבהם תְשׁוּאָה() עשוי להיות שימושי.

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