Java多线程中的wait/notify

关于对象锁:对象锁 - http://blog.csdn.net/yx0628/article/details/79086511
wait 方法在使用之前,必须先获得此对象的对象锁,所以必须在同步方法或者同步块中使用,执行 wait 方法后,当前线程释放该对象的锁。wait 返回之前,此线程需要和其他等待对象的线程竞争来获得锁,才能继续执行 wait 后的处理。
notify 方法也必须在同步方法或者同步块中调用,这个方法用来通知其他等待当前对象的线程,如果有多个线程在等待,就由JVM随机挑选一个在 wait 状态的线程,对其发送 notify,将对象的对象锁交给该线程。当执行完 notify 方法后,不会立即交出对象锁,要等当前线程执行完同步的代码块后,才会将对象锁交出。另外,当某个处于 wait 状态的线程运行完之后,如果没有再次调用 notify 方法,其他所有处于 wait 状态等待对象锁的线程将不会收到通知,从而就不会被执行。
下面一个多线程编程核心技术书中的例子:

public class ThreadA extends Thread{

    private Object lock;

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

    @Override
    public void run() {
        try{
            synchronized (lock) {
                System.out.println("开始 wait: " + System.currentTimeMillis());
                lock.wait();
                System.out.println("结束 wait: " + System.currentTimeMillis());
            }
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }

}


public class ThreadB extends Thread{

    private Object lock;

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

    @Override
    public void run() {
        synchronized (lock) {
            System.out.println("开始 notify: " + System.currentTimeMillis());
            lock.notify();
            System.out.println("结束 notify: " + System.currentTimeMillis());
        }
    }

}


public class Test {

    public static void main(String[] args) {

        try {
            Object lock = new Object();
            ThreadA threadA = new ThreadA(lock);
            threadA.start();
            Thread.sleep(3000);
            ThreadB threadB = new ThreadB(lock);
            threadB.start();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

执行结果为:

开始 wait: 1516585999636
开始 notify: 1516586002635
结束 notify: 1516586002636
结束 wait: 1516586002636

可以看到 wait 在 notify 的同步块完全执行完后,开始被唤醒执行的。
另外,notify 和 notifyAll 不同,notify 方法只通知一个等待队列中的线程,使其变为可执行,其他线程仍在等待队列中等待通知信号;而 notifyAll 可以让所有处于等待同一资源的线程从等待状态变为可执行状态。此时,优先级高的线程先执行,也有可能是随机由JVM来随机执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值