1

方法简介

1. wait()

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

此时,代码块中会释放对对象lockObjectA的锁定,同时使lockObjectA进行等待,直到有线程调用了它的notify()或notifyAll()方法,才继续将lockObjectA锁定,并继续执行下面程序。
即:调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。

2. notify()

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

唤醒在等待该对象同步锁的线程(只唤醒一个),在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
即:调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。

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
全部结束

Cesar
277 声望10 粉丝

Talk is cheap