1. 程式人生 > >Java多執行緒學習筆記(三) wait/notify

Java多執行緒學習筆記(三) wait/notify

1.wait()

  • wait()的作用是使當前執行程式碼的執行緒進行等待, 知道接到通知(notify)或者中斷為止
  • wait()是Object類的方法
  • 當執行緒處於wait,呼叫interrupt()會出現InterruptedException
  • 在呼叫wait()之前,執行緒必須獲得該物件的物件級別鎖
  • 在呼叫wait()之後,執行緒釋放鎖
  • wait(long),等待超過這個時間自動喚醒

2.notify()

  • 在呼叫notify()之前,執行緒必須獲得該物件的物件級別鎖
  • 在呼叫notify()之後,執行緒不會立刻釋放鎖,要退出synchronized程式碼塊後才會釋放鎖
  • 如果有多個執行緒等待,則由執行緒規劃器隨機選1個執行緒,對其發出notify
  • 如果要喚醒所有執行緒,使用notifyAll(),可解決多生產者/消費者假死狀態問題

3.實驗wait/notify

3.1 呼叫wait()的執行緒

public class MyThreadOne extends Thread{
    private Object lock;

    public MyThreadOne(Object lock){
        super();
        this.lock = lock;
    }

    @Override
    public
void run(){ try{ synchronized (lock){ System.out.println("wait begin"); lock.wait(); System.out.println("wait end"); } }catch (InterruptedException e){ e.printStackTrace(); } } }

3.2 呼叫notify()的執行緒

public class MyThreadTwo extends Thread {
    private Object lock;

    public MyThreadTwo(Object lock){
        super();
        this.lock = lock;
    }

    @Override
    public void run(){
        synchronized (lock){
            System.out.println("notify begin");
            lock.notify();
            System.out.println("notify end");
        }
    }
}

3.3 測試類

public class Test {
    public static void main(String[] args) {
        try{
            Object lock = new Object();
            MyThreadOne t1 = new MyThreadOne(lock);
            t1.start();
            Thread.sleep(2000);

            MyThreadTwo t2 = new MyThreadTwo(lock);
            t2.start();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

3.4 結果

在這裡插入圖片描述