【多线程基础】wait和notify


一、wait()方法

        当一个实例对象调用wait()方法之后。当前线程就会在这个对象上等待。

举一个有趣的例子:

wait()方法是Object类的一个方法,因此Java中的所有类都默认继承了该方法,也就是都能使用该方法。

但是这个wait()方法其实是一个final修饰的方法,所以不可以被子类重写,子类只能使用Object的实现。

wait()方法在调用当前线程之前获取所在对象的监视器锁🔒,如果没有获取对象的监视器锁,直接调用wait()方法,会抛出IllegalMonitorStateException

当在一个实例对象上调用了wait()方法之后,当前线程就会释放掉它获取到的锁资源,将锁资源让给其它线程去竞争,然后当前线程就会阻塞等待。

随后只有在其他线程调用该共享对象的notify()方法或者notifyAll()方法时,当前阻塞等待的线程就会被唤醒,重新再去竞争锁资源。

二、notify()方法

notify() 方法也是一个 Object 类的方法,所有 Java 类也都默认继承了该方法,都可以调用该方法,这个方法也是被 final 修饰的,因此也不可被子类重写,子类只能使用 Object 的实现。

        notify() 方法和 wait() 方法类似,都是需要先获取当前线程的共享对象监视器,如果没有也会抛出 IllegalMonitorStateException 异常。

        notify 会随机的唤醒被阻塞到该共享对象上的一个线程,而 notifyAll() 则会唤醒所有在该共享对象上被wait 方法阻塞而陷入等待状态的线程。
 

public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (locker) {
                System.out.println("wait之前");
                try {
                    locker.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("wait之后");
            }
        });
        t1.start();
        //调用sleep是因为线程间的调度是无序的,保证t1线程先执行,进行阻塞等待状态,防止还没阻塞就notify
        Thread.sleep(1000);
        Thread t2 = new Thread(() -> {
            synchronized (locker) {
                System.out.println("notify之前");
                locker.notify();
                System.out.println("notify之后");
            }
        });
        t2.start();
    }
}

 三、wait()和sleep()的区别

相同点:wait()和sleep()都可以暂停线程的执行

不同点:1、所在类不同

                        sleep()是Thread类的静态方法

                        wait()是Object类的方法

               2、锁释放不同

                        sleep()是不释放锁的

                        wait()释放锁

               3、用途不同

                        sleep()常用于一定时间内暂停线程执行。

                        wait()常用于线程间的交互通信

               4、用法不同

                        sleep()方法睡眠指定时间之后,线程会自动苏醒

                        wait()方法被调用后,可以通过notify()和notifyAll()来唤醒线程


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值