通过wait和notify来协调线程执行顺序

为什么要协调线程执行顺序

        wait和notify是多线程编程中的重要工具,多线程调度是随机的,很多时候希望多个线程能够按照我们规定的顺序来执行,完成线程之间的配合工作

注意事项

        1.要想让notify能够顺利唤醒wait,就需要确保wait和notify是同一个对象调用的,所以哪个对象调用wait和notify方法不重要,重要的是同一个对象调用

        2.wait和notify都需要放到synchronized之内
        wait在执行的时候,会做三件事,1.解锁,2.阻塞等待,3.等待其他的线程调用notify被唤醒,就会尝试重新加锁,加锁成功,wait执行完毕,继续执行后面的逻辑
        因为wait在执行的时候要解锁,所以wait需要放到synchronized之内,虽然notify不涉及解锁,但也强制要求要放到synchronized中

        3.如果进行notify的时候,没有线程处于wait状态,就相当于没用(也没有副作用)

wait与sleep之间的区别

        sleep有一个明确的时间,到达时间,自然就会被唤醒,也能提前唤醒,使用interrupt提前唤醒

        wait默认就是一直死等,一直等到有其他线程notify,wait也能被interrupt提前唤醒

        不过wait也有带超时时间的版本,等待一定的时间就直接执行之后的代码

        协调多个线程之间的执行顺序,当然还是优先考虑wait-notify而不是sleep

一些细节

        如果此时有多个线程处于waiting的状态,而一个线程调用了notify方法,那么就会随机唤醒一个线程,而notifyall可以唤醒所有的线程,唤醒所有的线程后,线程们再争夺上锁的机会

如果我们想要唤醒一个指定的线程怎么办呢?

        可以让不同线程使用不同的对象来进行wait,想唤醒哪个线程,就可以用对应的对象调用notify方法

通过wait和notify来协调线程执行顺序的代码案例

package 协调线程执行顺序;

import com.sun.source.tree.SynchronizedTree;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: wuyulin
 * Date: 2023-07-26
 * Time: 17:44
 */


public class Demo1 {
    private static Object locker=new Object();

    public static void main(String[] args) {
        Thread A=new Thread(()->{
            synchronized(locker){
                System.out.println("A wait 开始执行");

                try {
                    locker.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                System.out.println("A wait 执行结束");
            }

        });

        Thread B=new Thread(()->{
            synchronized(locker){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("B notify 开始");
                locker.notify();
                System.out.println("B notify 结束");
            }
        });

        A.start();
        B.start();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林想被监督学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值