首頁常見問題正文

Java如何實(shí)現(xiàn)多線程之間的通訊和協(xié)作?

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

IT培訓(xùn)班

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

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

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

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

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.");
        }
    }
}

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

  運(yùn)行這個(gè)示例代碼后,可以看到如下輸出:

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

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

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!