כיצד לעכב את ביצוע הקוד ב- Java

1. הקדמה

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

מדריך זה יתאר שתי דרכים ליישום עיכובים בג'אווה.

2. א פְּתִילגישה מבוססת

כאשר תוכנית Java פועלת, היא מולידה תהליך שפועל במכונה המארחת. תהליך זה מכיל לפחות חוט אחד - החוט הראשי - שבו התוכנית פועלת. יתר על כן, ג'אווה מאפשרת ריבוי הליכי משנה, המאפשר ליישומים ליצור שרשור חדש שרץ במקביל, או באופן אסינכרוני, לשרשור הראשי.

2.1. באמצעות חוט. שינה

דרך מהירה ומלוכלכת להשהות בג'אווה היא להורות לשרשור הנוכחי לישון למשך זמן מוגדר. ניתן לעשות זאת באמצעות Thread.sleep (אלפיות השנייה):

נסה את {Thread.sleep (secondsToSleep * 1000); } לתפוס (InterruptedException כלומר) {Thread.currentThread (). interrupt (); }

זה נוהג טוב לעטוף את לִישׁוֹן שיטה בבלוק ניסיון / תפוס במקרה שחוט אחר קוטע את חוט השינה. במקרה זה, אנו תופסים את חריג מופרע ולקטוע במפורש את השרשור הנוכחי, כך שניתן יהיה לתפוס אותו אחר כך ולטפל בו. זה חשוב יותר בתכנית מרובת שרשורים, אך עדיין נוהגים טובים בתוכנית שרשורים בודדים למקרה שנוסיף שרשורים אחרים בהמשך.

2.2. באמצעות TimeUnit.sleep

לקריאות טובה יותר נוכל להשתמש TimeUnit.XXX.sleep (y), איפה XXX האם יחידת הזמן לישון עבורה (שניות, דקותוכו '), ו y הוא מספר היחידה שיש לישון עבורה. זה משתמש חוט. שינה מאחורי הקלעים. הנה דוגמה ל TimeUnit תחביר:

נסה את {TimeUnit.SECONDS.sleep (secondsToSleep); } לתפוס (InterruptedException כלומר) {Thread.currentThread (). interrupt (); }

למרות זאת, ישנם כמה חסרונות בשימוש בשיטות מבוססות חוטים אלה:

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

3. An שירות ExecutorServiceגישה מבוססת

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

כדי להריץ פיסת קוד פעם אחת לאחר עיכוב, אנו יכולים להשתמש ב- לוח זמנים שיטה:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor (); executorService.schedule (Classname :: someTask, delayInSeconds, TimeUnit.SECONDS);

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

  • someTask הוא שם השיטה אותה אנו רוצים לבצע
  • שם כיתה הוא שם המחלקה המכילה את someTask שיטה

כדי להפעיל משימה במרווחי זמן קבועים, נוכל להשתמש ב- scheduleAtFixedRate שיטה:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor (); executorService.scheduleAtFixedRate (Classname :: someTask, 0, delayInSeconds, TimeUnit.SECONDS);

זה יקרא שוב ושוב את someTask שיטה, בהמתנה ל delayInSeconds בין כל שיחה.

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

4. מסקנה

במאמר זה דנו בשתי שיטות ליצירת עיכובים בתוכניות Java.

הקוד המלא של מאמר זה ניתן למצוא באתר Github. זהו פרויקט מבוסס Maven, כך שיהיה קל לייבא ולהפעיל אותו כפי שהוא.