Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khi nào có thể gọi wait() và wait(long) của Thread trong Java?

Khi phương thức wait() được gọi trên một đối tượng, nó khiến luồng hiện tại chờ đợi cho đến khi một luồng khác gọi phương thức notify() hoặc notifyAll() cho đối tượng này, trong khi wait(long timeout) khiến luồng hiện tại chờ đợi cho đến khi một luồng khác gọi notify() hoặc notifyAll(), hoặc sau khi hết thời gian chờ quy định.

wait()

Trong chương trình dưới đây, khi wait() được gọi trên một đối tượng, luồng chuyển từ trạng thái running sang waiting. Nó chờ luồng khác gọi notify() hoặc notifyAll() để chuyển sang trạng thái runnable, có thể hình thành deadlock.

Ví dụ

class MyRunnable implements Runnable {
    public void run() {
        synchronized(this) {
            System.out.println("Trong phương thức run()");
            try {
                this.wait();
                System.out.println("Luồng ở trạng thái chờ, đợi luồng khác gọi notify() hoặc notifyAll()");
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }
    }
}

public class WaitMethodWithoutParameterTest {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable, "Thread-1");
        thread.start();
    }
}

Kết quả

Trong phương thức run()

wait(long)

Trong chương trình dưới đây, khi wait(1000) được gọi trên một đối tượng, luồng chuyển từ running sang waiting state, ngay cả khi notify() hoặc notifyAll() không được gọi, sau khi hết thời gian chờ luồng sẽ chuyển từ waiting sang runnable state.

Ví dụ

class MyRunnable implements Runnable {
    public void run() {
        synchronized(this) {
            System.out.println("Trong phương thức run()");
            try {
                this.wait(1000);
                System.out.println("Luồng ở trạng thái chờ, đợi luồng khác gọi notify() hoặc notifyAll()");
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }
        }
    }
}

public class WaitMethodWithParameterTest {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable, "Thread-1");
        thread.start();
    }
}

Kết quả

Trong phương thức run()
Luồng ở trạng thái chờ, đợi luồng khác gọi notify() hoặc notifyAll()