CodeGym /בלוג Java /Random-HE /שיטת Thread.sleep() ב-Java
John Squirrels
רָמָה
San Francisco

שיטת Thread.sleep() ב-Java

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

שיטת Thread.sleep().

המחלקה Thread קיימת בחבילת Java.lang ומכילה את שיטת Thread.sleep() . שיטת ה-Java.lang.thread sleep() משמשת להשעיית השרשור הנוכחי למשך פרק זמן מוגדר באלפיות שניות. אם תסתכל על Oracle docs , תגלה שיש שתי שיטות sleep() עמוסות מדי של המחלקה Thread .
static void sleep(long millis)
כאשר מיליס הוא הזמן באלפיות שניות. שיטה זו גורמת ל-thread המבצע כעת לישון (הפסקת ביצוע זמנית, "שינה") במשך מיליליות של אלפיות השנייה, בהתאם לדיוק של הטיימרים והמתזמנים של המערכת. ערך הארגומנט עבור אלפיות שניות לא יכול להיות שלילי. אם כן, ה- IlegalArgumentException ייזרק.
static void sleep(long millis, int nanos)
כאשר טוחן את הזמן במילי-שניות וננו הוא הזמן בננו-שניות. גרסה זו של שיטה משמשת להשהיית ביצוע השרשור הנוכחי למשך הזמן המדויק באלפיות שניות וננו שניות. הערך של ננו-שנייה תקף בין 0 ל-999999. בואו ניצור תוכנית פשוטה המשתמשת בשיטת Thread.sleep() כדי להשהות את ביצוע השרשור הראשי למשך 5 שניות:
public class SleepDemo {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
       }
}
מה קורה בתוכנית הזו? תחילה הוא מתחיל, אחר כך הוא ישן במשך 5 אלפיות שניות (5 שניות), ואז מדפיס לקונסולה הודעה לגבי משך הזמן שהוא היה קפוא, ואז יוצא. הפלט הוא:
השרשור מושהה למשך 5008 אלפיות שניות
כפי שאתה יכול לראות, התוכנית לא עצרה למשך 5 שניות, אלא קצת יותר. כמו כן, אם תפעיל את התוכנית במחשב שלך, תבחין שהיא עלולה לעצור את ביצוע השרשור למשך יותר מ-5000 אלפיות שניות ולא הכרחי למשך 5008 אלפיות שניות. הנקודה היא שהכל תלוי במערכת ההפעלה וביישום הספציפי של מתזמן השרשור. בפירוט קטן יותר, הזמן בפועל שרשור ממתין לפני התעוררות ומתחיל ביצוע תלוי בטיימרים ובמתזמנים של המערכת. עבור מערכת שקטה, זמן השינה בפועל קרוב לזמן השינה שצוין, אך עבור מערכת עמוסה הוא יהיה מעט יותר ארוך. שיטה זו משמשת לעתים קרובות בשרשורי ילדים כאשר אתה צריך לבצע פעולה כלשהי כל הזמן, אך לא לעתים קרובות מדי. הנה דוגמה לתוכנית שתדפיס הודעה כל שנייה ולעולם לא תצא:
public class SleepDemo1 {

   public static void main(String[] args) throws InterruptedException {
       while (true)
       {
           Thread.sleep(1000);
           System.out.println("One more second");
       }
   }
}

נקודות חשובות ב-Java Thread Sleep

חשוב לזכור ששיטת Java Thread Sleep פועלת בצורה כזו ש:
  • זה תמיד משעה את ביצוע השרשור הנוכחי.

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

  • חוט השינה אינו חוסם את החוט הנוכחי.

  • כל שרשור אחר יכול לקטוע את חוט השינה הנוכחי, ובמקרה זה נזרק Exception Interrupted .

  • ערך הארגומנט עבור אלפיות שניות לא יכול להיות שלילי, אחרת ייזרק IllegalArgumentException .

כדי לתת דוגמה לזריקת IllegalArgumentException , פשוט שנה קצת את התוכנית לעיל:
public class SleepDemo1 {

       public static void main(String[] args) throws InterruptedException {
           //the current time in milliseconds
           long start = System.currentTimeMillis();
           // stop the main thread of the program for 5000 milliseconds (5 seconds)
           Thread.sleep(-5000);
           System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
       }
}
הנה הפלט:
חריגה בשרשור "ראשי" java.lang.IllegalArgumentException: ערך הזמן הקצוב הוא שלילי ב-java.base/java.lang.Thread.sleep(Native Method) ב-SleepDemo.main(SleepDemo.java:7)
למעלה הנחנו את החוט הראשי לישון. עכשיו בואו ננסה ליישם את השיטה על שרשור אחר.
// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{

       public void run()
       {
           // thread 0
           try {
               for (int i = 0; i < 10; i++) {

                   // sleeps the main thread for about 2 seconds
                   Thread.sleep(2000);
                   System.out.println(i);
               }
           }
           catch (Exception e) {

               // catching the exception
               System.out.println(e);
           }
       }
       public static void main(String[] args)
       {
           SleepDemo2 sleepDemo2 = new SleepDemo2();
           sleepDemo2.start();
       }
}
הפלט הוא:
0 1 2 3 4 5 6 7 8 9
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION