Cả 2 method wait() và sleep() đều được dùng trong lập trình đa luồng mà chúng thường hay sử dụng vào mục đích đồng bộ hoá. Vậy đâu là điểm khác biệt giữa chúng? chúng ta sẽ cùng nhau tìm hiểu trong bài viết này.
Điểm khác nhau giữa wait() và sleep()
wait() là một instance method được sử dụng để đồng bộ hoá. Nó có thể được gọi bởi bất kỳ object nào vì nó đã được định nghĩa sẵn trong Object class. Tuy nhiên chú ý rằng wait() method chỉ được gọi trong synchronized block. Khi wait() method được gọi, thread hiện tại sẽ rơi vào trạng thái chờ cho đến khi một thread khác đánh thức nó, hoặc tự đánh thức sau một khoảng thời gian được chỉ định.
Mặc khác, Thread.sleep() là một static method có thể gọi ở bất cứ đâu. Thread.sleep() sẽ tạm dừng thread hiện tại cho đến khi nó được đánh thức bởi khoảng thời gian được chỉ định.
public class Example { private static Object LOCK = new Object(); public static void sleepWaitExamples() throws InterruptedException { Thread.sleep(1000); System.out.println( "Thread '" + Thread.currentThread().getName() + "' is woken after sleeping for 1 second"); synchronized (LOCK) { LOCK.wait(1000); System.out.println("Object '" + LOCK + "' is woken after" + " waiting for 1 second"); } } }
Output:
Thread ‘main’ is woken after sleeping for 1 second
Object ‘java.lang.Object@63947c6b’ is woken after waiting for 1 second
Đánh thức wait() và sleep()
Khi sử dụng Thread.sleep() method nó sẽ tự động đánh thức sau một khoảng thời gian được chỉ định nếu không bị gián đoạn.
Đối với wait(), khi wait() method được gọi, thread hiện tại sẽ rơi vào trạng thái chờ cho đến khi một thread khác gọi notify() hay notifyAll() trên cùng một object. Vì thế wait() method phải được đặt trong monitor object (là một khối code truy cập vào các object được sử dụng bởi nhiều thread, chúng được bảo vệ bởi synchronized để đảm bảo rằng chỉ có 1 thread truy cập vào object tại cùng một thời điểm).
Ví dụ về wait() method
class Sum implements Runnable{ public int sum = 0; @Override public void run() { synchronized (this) { int i = 0; while (i < 100000) { sum += i; i++; } notifyAll(); } } } class Main { public static void main(String[] agrs) throws InterruptedException { Sum sum = new Sum(); sum.run(); synchronized (sum) { while (sum.sum == 0) { System.out.println("Waiting for ThreadB to complete..."); sum.wait(); } System.out.println("ThreadB has completed. " + "Sum from that thread is: " + sum.sum); } } }
Output: ThreadB has completed. Sum from that thread is: 704982704
Tóm lược
wait() và sleep() method có cách sử dụng khác nhau trong khi sleep() sử dụng để quản lý thời gian thực thi của 1 thread thì wait được dùng để đồng bộ hóa các thread.
Nguồn tham khảo
https://www.baeldung.com/java-wait-and-sleep