Thread sleep trong java hoạt động như thế nào?

Thread#sleep() được sử dụng để tạm ngưng quá trình của thread hiện tại với một khoảng thời gian được chỉ định. Lưu ý khoảng thời gian tạm ngưng không thể là số âm nếu không sẽ bị ném IllegalArgumentException.

Chúng ta có các overloading sleep() sau:

  • Thread.sleep(long millis) – Tạm ngưng thread hiện tại khoảng millis.
  • Thread.sleep(long milis, long nanos) – Tạm ngưng thread hiện tại khoảng millis và thêm một khoảng nanos từ 0 đến 999999.

Thread sleep hoạt động như thế nào?

Thread.sleep() sẽ nói chuyện với bộ lập lịch của hệ thống để đẩy thread hiện tại và trạng thái chờ với một khoảng thời gian được chỉ định. Khi khoảng thời gian chờ thread sẽ chuyển từ trạng thái chờ sang trạng tháy runnable và chờ đến khi CPU thực thi tiếp thread. 

Như vậy khoảng thời gian chờ thật sự sẽ phụ thuộc vào bộ lập lịch và bộ hẹn giờ của hệ thống. Nếu hệ thống đang rảnh thì khoảng thời gian chờ có thể gần với khoảng thời gian mà chúng ta chỉ định, còn nếu hệ thống đang bận thì khoảng chênh lệch sẽ khá lớn so với khoảng thời gian được chỉ định.

Thread sleep sẽ không làm ảnh hưởng đến thread hiện tại mà chỉ đơn giản là tạm ngưng thực thi một khoảng thời gian, các cơ chế đồng bộ, các kết quả tính toán sẽ không bị ảnh hưởng. Một thread đang ngủ có thể bị làm gián đoạn bởi các thread khác đang chạy, lúc này thread đang ngủ sẽ thức dậy và ném InterruptedException, cho nên chúng ta phải xử lý exception cho sleep().

Ví dụ 1: Tạm ngưng main thread trong khoảng thời gian 2000ms.,

public class ThreadSleep {

    public static void main(String[] args) throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(2000);
        System.out.println("Sleep time in ms = "+(System.currentTimeMillis()-start));
        
    }

}

Output: leep time in ms = 2001

Kết quả trên mình đã chạy nhiều lần mới được, để chúng ta thấy rằng không phải cứ sleep(2000) là nó chờ đúng 2000ms đâu nhé.

Ví dụ 2: Tạm ngưng main thread và một thread con của main thread trong khoảng thời gian 1s.

    class ThreadSleep {

        public static void main(String[] args) throws InterruptedException {

            System.out.println("Main thread start");
            long startMain = System.currentTimeMillis();
            Thread.sleep(1000);
            Thread t = new Thread(() -> {
                System.out.println("Child thread start");
                try {
                    long start = System.currentTimeMillis();
                    Thread.sleep(1000);
                    System.out.println("Child thread:" + (System.currentTimeMillis() - start));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            t.start();

            System.out.println("Main thread:" + (System.currentTimeMillis() - startMain));
        }
    }

Output:

Main thread start
Main thread:1030
Child thread start
Child thread:1000

5 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x