CodeGym /จาวาบล็อก /สุ่ม /วิธีการ Thread.sleep() ใน Java
John Squirrels
ระดับ
San Francisco

วิธีการ Thread.sleep() ใน Java

เผยแพร่ในกลุ่ม
ในโปรแกรม Java มีบางสถานการณ์ที่เธรดทำงานเร็วเกินไปหรือโปรแกรมจำเป็นต้องเปลี่ยนไปใช้เธรดอื่น ในการทำเช่นนี้ คุณต้องระงับการดำเนินการของเธรดปัจจุบัน ใน Java สามารถทำได้โดยใช้เมธอด java.lang.Thread.sleep()

วิธีการ Thread.sleep()

คลาสเธรดมีอยู่ในแพ็คเกจ Java.lang และมีเมธอด Thread.sleep() วิธีการ Java.lang.thread sleep()ใช้เพื่อระงับเธรดปัจจุบันตามระยะเวลาที่กำหนดในหน่วยมิลลิวินาที หากคุณดูOracle docsคุณจะพบว่ามี เมธอด sleep() ที่โอเวอร์โหลดสอง เมธอดของคลาส เธรด

static void sleep(long millis)
โดยที่มิลลิวินาทีคือเวลาในหน่วยมิลลิวินาที วิธีนี้ทำให้เธรดที่กำลังดำเนินการอยู่เข้าสู่โหมดสลีป (หยุดการดำเนินการชั่วคราว "สลีป") เป็นมิลลิวินาทีของมิลลิวินาที ขึ้นอยู่กับความแม่นยำของตัวจับเวลาระบบและตัวกำหนดตารางเวลา ค่าอาร์กิวเมนต์สำหรับมิลลิวินาทีต้องไม่เป็นค่าลบ ถ้าเป็นเช่นนั้นIllegalArgumentExceptionจะถูกส่งออกไป

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 วินาที) จากนั้นพิมพ์ข้อความไปที่คอนโซลเกี่ยวกับระยะเวลาที่หยุดทำงาน จากนั้นจึงออก ผลลัพธ์คือ:
เธรดถูกหยุดชั่วคราวเป็นเวลา 5,008 มิลลิวินาที
อย่างที่คุณเห็น โปรแกรมไม่ได้หยุดชั่วคราวเป็นเวลา 5 วินาที แต่นานกว่านั้นเล็กน้อย นอกจากนี้ หากคุณเรียกใช้โปรแกรมบนคอมพิวเตอร์ของคุณ คุณจะสังเกตเห็นว่าโปรแกรมสามารถหยุดการดำเนินการของเธรดนานกว่า 5,000 มิลลิวินาที และไม่จำเป็นสำหรับ 5,008 มิลลิวินาที ประเด็นคือทั้งหมดขึ้นอยู่กับระบบปฏิบัติการและการใช้งานเฉพาะของตัวกำหนดเวลาเธรด ในรายละเอียดเพิ่มเติมเล็กน้อย เวลาจริงที่เธรดรอก่อนที่จะปลุกและเริ่มดำเนินการขึ้นอยู่กับตัวจับเวลาระบบและตัวกำหนดตารางเวลา สำหรับระบบที่เงียบ เวลาสลีปจริงจะใกล้เคียงกับเวลาสลีปที่ระบุ แต่สำหรับระบบที่โหลด เวลาจะนานกว่าเล็กน้อย วิธีนี้มักใช้ในเธรดย่อยเมื่อคุณจำเป็นต้องดำเนินการบางอย่างตลอดเวลา แต่ไม่บ่อยเกินไป นี่คือตัวอย่างของโปรแกรมที่จะพิมพ์ข้อความทุก ๆ วินาทีและไม่ออก:

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ทำงานในลักษณะที่:
  • มันระงับการดำเนินการของเธรดปัจจุบันเสมอ

  • เธรดจริงจะเข้าสู่โหมดสลีปจนกว่าจะตื่นขึ้น และเวลาดำเนินการขึ้นอยู่กับตัวจับเวลาระบบและตัวกำหนดตารางเวลา

  • เธรดที่หลับไม่ได้ปิดกั้นเธรดปัจจุบัน

  • เธรดอื่นใดสามารถขัดจังหวะเธรดที่กำลังพักอยู่ ซึ่งในกรณีนี้InterruptedExceptionจะถูกส่งออกไป

  • ค่าอาร์กิวเมนต์สำหรับมิลลิวินาทีต้องไม่เป็นค่าลบ มิฉะนั้น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");
       }
}
นี่คือผลลัพธ์:
ข้อยกเว้นในเธรด "main" 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