CodeGym /Blog Java /Ngẫu nhiên /Phương thức Thread.sleep() trong Java

Phương thức Thread.sleep() trong Java

Xuất bản trong nhóm
Trong các chương trình Java, có những tình huống khi một luồng đang thực thi quá nhanh hoặc chương trình cần chuyển sang một luồng khác. Để làm điều này, bạn cần tạm dừng thực thi luồng hiện tại. Trong Java, điều này có thể được thực hiện bằng cách sử dụng phương thức java.lang.Thread.sleep() .

Phương thức Thread.sleep()

Lớp Thread có trong gói Java.lang và chứa phương thức Thread.sleep() . Phương thức sleep() trong Java.lang.thread được sử dụng để tạm dừng luồng hiện tại trong một khoảng thời gian xác định tính bằng mili giây. Nếu bạn xem các tài liệu của Oracle , bạn sẽ thấy rằng có hai phương thức sleep() bị quá tải của lớp Thread .

static void sleep(long millis)
trong đó millis là thời gian tính bằng mili giây. Phương pháp này làm cho luồng đang thực thi chuyển sang trạng thái ngủ (tạm thời dừng thực thi, "ngủ") trong một phần nghìn mili giây, tùy thuộc vào độ chính xác của bộ hẹn giờ và bộ lập lịch của hệ thống. Giá trị đối số cho mili giây không được âm. Nếu vậy, IllegalArgumentException sẽ bị ném.

static void sleep(long millis, int nanos)
trong đó tính thời gian tính bằng mili giây và nanos là thời gian tính bằng nano giây. Biến thể của phương pháp này được sử dụng để tạm dừng việc thực thi luồng hiện tại trong thời gian chính xác tính bằng mili giây và nano giây. Giá trị nano giây có giá trị trong khoảng từ 0 đến 999999. Hãy tạo một chương trình đơn giản sử dụng phương thức Thread.sleep() để tạm dừng thực thi luồng chính trong 5 giây:

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");
       }
}
Điều gì đang xảy ra trong chương trình này? Đầu tiên, nó bắt đầu, sau đó nó ở chế độ ngủ trong 5 mili giây (5 giây), sau đó in ra bảng điều khiển một thông báo về thời gian nó bị đóng băng, rồi thoát. Đầu ra là:
Chủ đề bị tạm dừng trong 5008 mili giây
Như bạn có thể thấy, chương trình không tạm dừng trong 5 giây mà lâu hơn một chút. Ngoài ra, nếu bạn chạy chương trình trên máy tính của mình, bạn sẽ nhận thấy rằng nó có thể dừng thực thi luồng trong thời gian dài hơn 5000 mili giây và không cần thiết trong 5008 mili giây. Vấn đề là tất cả phụ thuộc vào hệ điều hành và cách triển khai cụ thể của bộ lập lịch luồng. Chi tiết hơn một chút, thời gian thực tế mà một luồng đợi trước khi thức dậy và bắt đầu thực thi phụ thuộc vào bộ hẹn giờ và bộ lập lịch của hệ thống. Đối với một hệ thống yên tĩnh, thời gian ngủ thực tế gần với thời gian ngủ được chỉ định, nhưng đối với một hệ thống được tải thì thời gian này sẽ lâu hơn một chút. Phương pháp này thường được sử dụng trong các luồng con khi bạn cần thực hiện một số hành động mọi lúc, nhưng không quá thường xuyên. Đây là một ví dụ về chương trình sẽ in một thông báo mỗi giây và không bao giờ thoát:

public class SleepDemo1 {

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

Các điểm quan trọng của Java Thread Sleep

Điều quan trọng cần nhớ là phương thức Java Thread Sleep hoạt động theo cách:
  • Nó luôn tạm dừng việc thực hiện luồng hiện tại.

  • Chuỗi thực sự ngủ cho đến khi nó thức dậy và thời gian thực hiện phụ thuộc vào bộ hẹn giờ và bộ lập lịch của hệ thống.

  • Chủ đề đang ngủ không chặn chủ đề hiện tại.

  • Bất kỳ luồng nào khác có thể làm gián đoạn luồng đang ngủ hiện tại, trong trường hợp đó, một Ngoại lệ gián đoạn được ném ra.

  • Giá trị đối số cho mili giây không được âm, nếu không, một IllegalArgumentException sẽ được đưa ra.

Để đưa ra ví dụ về việc ném IllegalArgumentException , chỉ cần sửa đổi chương trình trên một chút:

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");
       }
}
Đây là đầu ra:
Ngoại lệ trong luồng "chính" java.lang.IllegalArgumentException: giá trị thời gian chờ là âm tại java.base/java.lang.Thread.sleep(Phương thức gốc) tại SleepDemo.main(SleepDemo.java:7)
Ở trên, chúng tôi đặt chủ đề chính để ngủ. Bây giờ hãy thử áp dụng phương pháp này cho một số luồng khác.

// 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();
       }
}
Đầu ra là:
0 1 2 3 4 5 6 7 8 9
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION