更新時間:2023-04-07 來源:黑馬程序員 瀏覽量:
Java中可以通過wait(), notify()和notifyAll()方法來實現多線程之間的通訊和協(xié)作。
wait()方法用于讓一個線程等待,直到另一個線程通知它繼續(xù)執(zhí)行。當一個線程調用wait()方法時,它會釋放當前的鎖,然后進入等待狀態(tài)。等待狀態(tài)中的線程可以通過notify()或notifyAll()方法來被喚醒。
notify()方法用于喚醒一個等待狀態(tài)的線程。如果有多個線程等待,只會喚醒其中的一個。如果要喚醒所有等待狀態(tài)的線程,可以使用notifyAll()方法。
下面是一個簡單的示例代碼,演示了如何使用wait()、notify()和notifyAll()方法來實現多個線程之間的通訊和協(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."); } } }
在這個示例代碼中,創(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)的線程。