wait()、sleep()和yield()方法的区别

一、区别:

1、所属类不同:wait()是Object类中的非静态方法;sleep()、yield()是Thread类中的静态方法。

2、作用不同:wait()用于线程同步或者线程之间进行通信;sleep()用于休眠当前线程,并在指定的时间点被自动唤醒;yield()临时暂停当前正在执行的线程,来让有同样优先级的正在等待的线程有机会执行(如果等待的线程优先级较低,则当前线程继续执行)。

3、释放资源:wait()释放对象锁;sleep()不释放对象锁,抱着锁睡觉;yield()仅释放线程所占用的CPU。

4、应用场景不同:wait()适用于同步代码块中;sleep()休眠当前线程,应用场景没有限制;yield()暂停当前线程,应用场景也没有限制。

5、被唤醒后的状态不同:wait()被notify()或者notifyAll()唤醒后,先进入阻塞状态(先获得锁),然后进入就绪状态;sleep()被唤醒后,进入就绪状态;yield()不需要唤醒,一直处于就绪状态,获得CPU后继续运行。

wait 方法是实例方法(非 static 方法),因此不能在 static 中使用。wait/notify 必须搭配 synchronized 使用,否则会报错。

二、代码验证

wait释放锁


//wait释放锁验证
public class WaitDemo {

    public static void main(String[] args) {
        WaitDemo waitDemo = new WaitDemo();

        // 启动新线程,防止主线程被休眠
        new Thread(() -> {
            try {
                waitDemo.doWait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"线程t1").start();
        try{
            Thread.sleep(200);// 此行本身没有意义,是为了确保 wait() 先执行再执行 notify()}
        }catch (InterruptedException e){
            e.printStackTrace();
        }

        waitDemo.doNotify();
    }

    /**
     * 执行 wait()
     */
    private void doWait() throws InterruptedException {
         /*
        System.out.println("wait start.");
        this.wait();
        System.out.println("wait end.");
        */
        synchronized (this) {
            System.out.println("wait start.");
            this.wait();
            System.out.println("wait end.");
        }
        
    }

    /**
     * 执行 notify()
     */
    private void doNotify() {
        /*
        System.out.println("notify start.");
        this.notify();
        System.out.println("notify end.");
        */
        synchronized (this) {
            System.out.println("notify start.");
            this.notify();
            System.out.println("notify end.");
        }
        
    }
}

结果

SleepDemo


public class SleepDemo {
    private static Object locker = new Object();
    public static void main(String[] args) throws InterruptedException {
        SleepDemo sleepDemo = new SleepDemo();
        // 启动新线程,防止主线程被休眠
        new Thread(() -> {
            synchronized (locker) {
                try {
                    System.out.println("sleep start.");
                    Thread.sleep(1000);
                    System.out.println("sleep end.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        Thread.sleep(200);
        sleepDemo.doNotify();
    }

    /**
     * 执行 notify()
     */
    private void doNotify() {
        synchronized (locker) {
            System.out.println("notify start.");
            locker.notify();
            System.out.println("notify end.");
        }
    }
}

执行结果

参考文章

https://blog.csdn.net/weixin_39636102/article/details/113323853

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值