首頁常見問題正文

Java如何實現多線程之間的通訊和協作?

更新時間:2023-04-07 來源:黑馬程序員 瀏覽量:

IT培訓班

  Java中可以通過wait(), notify()和notifyAll()方法來實現多線程之間的通訊和協作。

  wait()方法用于讓一個線程等待,直到另一個線程通知它繼續(xù)執(zhí)行。當一個線程調用wait()方法時,它會釋放當前的鎖,然后進入等待狀態(tài)。等待狀態(tài)中的線程可以通過notify()或notifyAll()方法來被喚醒。

  notify()方法用于喚醒一個等待狀態(tài)的線程。如果有多個線程等待,只會喚醒其中的一個。如果要喚醒所有等待狀態(tài)的線程,可以使用notifyAll()方法。

  下面是一個簡單的示例代碼,演示了如何使用wait()、notify()和notifyAll()方法來實現多個線程之間的通訊和協作。

public class ThreadCommunicationDemo {
    private Object lock = new Object();
    private boolean flag = false;

    public static void main(String[] args) {
        ThreadCommunicationDemo demo = new ThreadCommunicationDemo();
        new Thread(demo::waitThread).start();
        new Thread(demo::notifyThread).start();
        new Thread(demo::notifyAllThread).start();
    }

    private void waitThread() {
        synchronized (lock) {
            while (!flag) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("waitThread is notified.");
        }
    }

    private void notifyThread() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (lock) {
            flag = true;
            lock.notify();
            System.out.println("notifyThread notifies one waiting thread.");
        }
    }

    private void notifyAllThread() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (lock) {
            flag = true;
            lock.notifyAll();
            System.out.println("notifyAllThread notifies all waiting threads.");
        }
    }
}

  在這個示例代碼中,創(chuàng)建了一個Object類型的鎖對象lock,以及一個boolean類型的flag變量。waitThread()方法會在lock對象上等待,直到flag變量為true時才會繼續(xù)執(zhí)行。notifyThread()方法會等待1秒鐘后將flag變量設置為true,并調用lock對象的notify()方法來喚醒等待在lock對象上的線程。notifyAllThread()方法會等待2秒鐘后將flag變量設置為true,并調用lock對象的notifyAll()方法來喚醒等待在lock對象上的所有線程。

  運行這個示例代碼后,可以看到如下輸出:

notifyThread notifies one waiting thread.
waitThread is notified.
notifyAllThread notifies all waiting threads.
waitThread is notified.

  這個輸出表明,使用notify()方法可以喚醒等待狀態(tài)中的一個線程,而使用notifyAll()方法可以喚醒所有等待狀態(tài)的線程。

分享到:
在線咨詢 我要報名
和我們在線交談!