Java中wait(),notify(),notifyAll()方法的使用

方法簡介

1. wait()

synchronized (lockObjectA) {
try {
    lockObjectA.wait();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

此時,代碼塊中會釋放對對象lockObjectA的鎖定,同時使lockObjectA進行等待,直到有線程調用了它的notify()或notifyAll()方法,才繼續將lockObjectA鎖定,並繼續執行下面程序。
即:調用任意對象的 wait() 方法致使該線程阻塞,該線程不可繼續執行,而且該對象上的鎖被釋放。ide

2. notify()

synchronized (lockObjectA) {
            lockObjectA.notify();
        }

喚醒在等待該對象同步鎖的線程(只喚醒一個),在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM肯定喚醒哪一個線程,並且不是按優先級。
即:調用任意對象的notify()方法則致使因調用該對象的 wait()方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到得到鎖後才真正可執行)。this

3. notifyAll()

將全部等待該對象的線程所有喚起。線程

示例

package Test0315;


/**
 * Created by Cesar on 2016/3/15.
 */
public class TestWait extends Thread {
    private static Object lockObjectA = new Object();
    private int key;

    public TestWait(int key) {
        this.key = key;
    }

    @Override
    public void run() {
        if (key == 0) {
            synchronized (lockObjectA) {
                System.out.println(key + "開始等待");
                try {
                    lockObjectA.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(key + "等待結束");
                System.out.println(key + "成功鎖定A");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(key + "釋放A");
        } else if (key == 1) {
            synchronized (lockObjectA) {
                lockObjectA.notify();
            }
            System.out.println(key + "釋放了A");
        } else {
            synchronized (lockObjectA){
                System.out.println(3+"鎖定了A");
            }
        }
    }


    public static void main(String[] args) {
        TestWait wait = new TestWait(0);
        wait.setName("Test Wait");
        wait.start();
        System.out.println("主線程休眠開始");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主線程休眠結束,喚醒開始");
        TestWait wait1 = new TestWait(1);
        wait1.start();

        TestWait wait2 = new TestWait(2);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        wait2.start();
        try {
            wait2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("所有結束");
    }
}

結果

主線程休眠開始
0開始等待
主線程休眠結束,喚醒開始
1釋放了A
0等待結束
0成功鎖定A
0釋放A
3鎖定了A
所有結束
相關文章
相關標籤/搜索