sleep() 和 wait() 的区别?

1、sleep() 方法正在执行的线程主动让出 cpu(然后 cpu 就可以去执行其他任务),在 sleep 指定时间后 cpu 再回到该线程继续往下执行(注意:sleep 方法只让出了 cpu,而并不会释放同步资源锁);而 wait() 方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了 notify() 方法,之前调用 wait() 的线程才会解除 wait 状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify 的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说 notify 只是让之前调用 wait 的线程有权利重新参与线程的调度);

2、 sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;

3、 sleep() 是线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait() 是 Object 的方法,调用会放弃对象锁,进入等待队列,待调用 notify()/notifyAll() 唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态。

发表评论

后才能评论

评论(3)

  • 一蓑烟雨 普通 2022-09-29 9:26 上午

    1、sleep() 方法是让出cpu(到了指定时间,自动回到原线程);wait() 方法是让出同步资源锁(需notify() 唤醒,或加过期时间);
    2、sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;
    3、sleep()是Thread的一个静态方法;wait()是Object的方法。

  • Noya 普通 2022-07-10 8:05 下午

    相同点:
    1. 都是用来将线程转为阻塞状态的
    2. 都是可以被打断的(如:调用线程的interrupt方法),需要捕捉InterruptedException;
    不同点:
    1. 【来源】wait是Object的方法,sleep是Thread的一个静态方法;
    2. 【核心】wait会释放monitor锁,让出cpu使用权,而sleep不会;
    3. 【使用】wait需要在同步方法内使用,而sleep不需要;
    4. 【使用】wait如果不加具体时间需要手动唤醒,让其退出wait set,而sleep必须添加休眠时间,时间结束后,自动推出阻塞状态。

  • kite 普通 2021-08-05 1:54 下午

    最后一句话是不是打错了,多打了个“不”,原文:“不再次获得对象锁才会进入运行状态”,应该成:再次获得对象锁才会进入运行状态。