一個線程修改了一個對象的值,而另外一個線程感知到了變化,而後進行相應的操做,整個java
過程開始於一個線程,而最終執行又是另外一個線程。ide
讓消費者線程不斷地循環檢查變量是否符合預期
線程
// 僞代碼 while(value != desire) { Thread.sleep(1000); } doSomething();
利用Object上的wait()和notify()方法進行線程間的交互
code
// A線程 synchronized(對象){ while(條件不知足){ 對象.wait(); } 對應的處理邏輯 } // B線程 synchronized(對象){ 改變條件 對象.notifyAll(); }
輪詢方式不只消耗CPU,並且沒有及時性.對象
public class NotifyWait { static Object lock = new Object(); static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { Thread waitThread = new Thread(new Wait(), "WaitThread"); waitThread.start(); TimeUnit.SECONDS.sleep(1); Thread notifyThread = new Thread(new Notify(), "NotifyThread"); notifyThread.start(); } static class Wait implements Runnable { @Override public void run() { synchronized (lock) { while (flag) { try { System.out.println("準備下好好工做了"); System.out.println("WAIT,我快要進入等待隊列了,好難受呀"); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("終於能好好工做了"); } } } static class Notify implements Runnable { @Override public void run() { synchronized (lock) { flag = false; System.out.println("NOTIFY,我要脫離等待隊列了,好高興呀"); lock.notifyAll(); } } } }
執行結果隊列
準備下好好工做了 WAIT,我快要進入等待隊列了,好難受呀 NOTIFY,我要脫離等待隊列了,好高興呀 終於能好好工做了