溫馨提示×

java wait()方法如何進行線程協調

小樊
102
2024-12-06 03:11:57
欄目: 編程語言

在Java中,wait()方法是Object類的一個方法,用于讓當前線程等待,直到其他線程調用同一個對象的notify()notifyAll()方法。wait()方法通常與synchronized關鍵字和Lock接口一起使用,以實現線程之間的協調。

以下是使用wait()方法進行線程協調的步驟:

  1. 將對象聲明為synchronized:為了讓線程能夠調用wait()notify()方法,需要將對象聲明為synchronized。這樣,一次只有一個線程可以訪問該對象的同步代碼塊。
public synchronized void waitForSignal() throws InterruptedException {
    wait();
}
  1. 使用wait()方法:在同步代碼塊中,調用wait()方法讓當前線程等待。這將導致線程進入等待狀態,并釋放對象的鎖。
public synchronized void waitForSignal() throws InterruptedException {
    wait();
}
  1. 使用notify()notifyAll()方法:當另一個線程需要通知等待的線程時,可以調用對象的notify()notifyAll()方法。notify()方法只喚醒一個等待的線程,而notifyAll()方法會喚醒所有等待的線程。
public synchronized void sendSignal() {
    notify(); // 或者使用 notifyAll() 喚醒所有等待的線程
}
  1. 編寫線程類:創建一個實現Runnable接口的線程類,并在其run()方法中調用同步對象的waitForSignal()sendSignal()方法。
public class MyThread implements Runnable {
    private final Object signalObject;

    public MyThread(Object signalObject) {
        this.signalObject = signalObject;
    }

    @Override
    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " is waiting for signal.");
            signalObject.waitForSignal();
            System.out.println(Thread.currentThread().getName() + " has received the signal.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  1. 創建并啟動線程:在主類中,創建MyThread對象并啟動線程。
public class Main {
    public static void main(String[] args) {
        Object signalObject = new Object();
        MyThread thread1 = new MyThread(signalObject);
        MyThread thread2 = new MyThread(signalObject);

        Thread thread1Instance = new Thread(thread1);
        Thread thread2Instance = new Thread(thread2);

        thread1Instance.start();
        thread2Instance.start();

        try {
            Thread.sleep(1000); // 等待一段時間,以便線程可以執行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Main thread is sending signal.");
        signalObject.sendSignal();
    }
}

這個示例中,兩個線程thread1thread2等待一個信號對象signalObjectwait()方法。主線程在啟動子線程后休眠1秒鐘,然后調用signalObjectsendSignal()方法喚醒一個等待的線程。被喚醒的線程將繼續執行并輸出接收到信號的消息。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女