更新時(shí)間:2023-04-07 來源:黑馬程序員 瀏覽量:
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è)簡(jiǎn)單的示例代碼,演示了如何使用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)的線程。