java——wait和notify的基本用法

本文介绍了Java中wait和notify方法的基本用法,包括wait的等待条件、线程间的协作以及wait结束等待的三种方式:notify/notifyAll、interrupted和超时。强调wait必须配合synchronized使用,并解释了notify与notifyAll的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简单了解一下wait

wait、sleep:用于线程休眠

wait是Object方法:
有参数时:wait(500)表示Time_waiting状态
无参数:wait()或wait(0)都表示无限等待:waiting状态

Sleep是Thread的静态方法:
Sleep(500)表示Time_waiting状态
Sleep(0)表示当前线程重新触发一次CPU竞争
不存在无参的情况:会报错
在这里插入图片描述

wait所做的事情:
1.使当前的线程进行等待
2.释放当前的锁;
3.被唤醒时,重新尝试获取这个锁

wait结束等待的条件 :
1.其他线程(也可以不是线程)调用了该对象的notify或notifyAll方法
2.其他线程(也可以不是线程)调用该等待线程的interrupted方法
3.等待时间超时:wait(有参)
注意:wait(0)表示的是无限等待

2.wait的用法:

1.必须配合synchronized使用
2.且使用的必须为同一个对象:synchronized (A)配合A.wait()使用
3.当线程执行到object.wait()时,此线程会同时释放锁synchronized (object);当它结束了wait后,此线程又会重新去争抢锁synchronized (object)。

public class Wait {
    public static void main(String[] args) throws InterruptedException {
        Object object=new Object();
        Thread thread=new Thread(()->{
            synchronized (object){
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("执行完成");
            }
        });
        thread.start();
     }
}

执行结果:
当前程序中不存在满足wait结束等待的条件,所以永远不会输出“执行完成”

3.wait结束等待:

1.使用notify:
必须配合synchronized使用;
且在notify后,当前线程不会马上释放锁,要等到当前线程被synchronized修饰的代码执行完,才会释放锁;
使用notify的对象为A,则只能唤醒A.wait()的线程,不能唤醒B.wait()的线程;
****小区别:
notify()方法——随机唤醒一个wait的线程
notifyAll()方法——唤醒所有wait的线程,让这些被唤醒的线程去争抢,按争抢顺序依次执行

public class Wait_notify2 {
    public static void main(String[] args) {

        Object object=new Object();
        Thread thread1=new Thread(()->{
            synchronized (object){
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程1执行完成");
        });

        Thread thread2=new Thread(()->{
            synchronized (object){
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程2执行完成");
        });

        Thread thread3=new Thread(()->{
            synchronized (object){
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程3执行完成");
        });
        thread1.start();
        thread2.start();
        thread3.start();

        Thread thread4=new Thread(()->{
            synchronized (object){
            //使用一次notify只能唤醒一个线程;
            //使用一次notifyAll可唤醒所有的线程
                object.notify();               
                object.notifyAll();
                System.out.println("线程4去唤醒wait的线程");
            }

        });
        thread4.start();


    }
}

输出的结果为:

当使用object.notify()时:只唤醒一个等待线程
在这里插入图片描述
当使用object.notifyAll()时:唤醒所有等待的线程
在这里插入图片描述

2.使用interrupted
调用该等待线程的interrupted方法,但会抛出异常;然后继续执行wait后的代码

public class Wait_interrupted {
    public static void main(String[] args) throws InterruptedException {
        Object object=new Object();
        Thread thread1=new Thread(()->{
            System.out.println("线程1去获得锁");
            synchronized (object){
                System.out.println("线程1得到了锁");
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程1执行完成");

        });
        thread1.start();

        //让主线程休眠一会,让线程1去得到锁并且处于休眠wait
        Thread.sleep(500);

        System.out.println("使用线程2去打断线程1的wait");
        //打断线程1
        thread1.interrupt();
    }
}

输出的结果为:
在这里插入图片描述
3.wait时间超时
当时间超时,会自动恢复执行,会重新去获得锁,然后从wait的下一行开始执行

public class Wait_timeout {
    public static void main(String[] args) {
        Object object=new Object();
        Thread thread1=new Thread(()->{
            System.out.println("去获得锁");
            synchronized (object){
                System.out.println("得到了锁");
                try {
                    object.wait(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程1执行完成");

        });
        thread1.start();
    }
}

执行结果为:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值