面试题:sleep()方法和wait()方法的异同点?

sleep() 方法和 wait() 方法都是用于控制线程执行流程的暂停,但它们之间存在一些关键性的差异,具体如下:

相同点:

  1. 暂停执行:两者都能使当前执行的线程暂停执行,进入非运行状态。
  2. 中断:调用这两个方法时,线程都可能被其他线程通过中断(interrupt() 方法)打断,引发 InterruptedException
  3. 状态转变:调用后,线程都会从运行状态转为非运行状态,对于 wait() 是进入等待(WAITING)状态,而对于 sleep() 是进入超时等待(TIMED_WAITING)状态。

不同点:

  1. 所属类别sleep() 是 Thread 类的静态方法,而 wait() 是 Object 类的成员方法。
  2. 锁处理sleep() 不会释放当前线程所持有的任何监视器锁(即不会释放锁),即使该线程位于同步代码块或同步方法中;而 wait() 方法会释放当前线程所持有的对象监视器锁,从而使其他等待该锁的线程能够获得执行机会。
  3. 调用位置sleep() 可以在任何地方调用,而 wait() 必须在同步代码块或同步方法中调用,否则会抛出 IllegalMonitorStateException 异常。
  4. 唤醒方式sleep() 到达指定时间后会自动恢复执行,无需其他操作;而 wait() 调用后,线程会一直等待,直到其他线程调用同一对象上的 notify() 或 notifyAll() 方法来唤醒,或者等待超时(如果指定了等待时间的话)。
  5. 参数灵活性wait() 方法可以通过传递超时时间来控制等待的最长时间,而 sleep() 也接受一个时间参数来指定休眠时间,但不支持条件唤醒,仅基于时间自动恢复执行。
  6. 用途sleep() 主要用于让当前线程暂停执行一段时间,不涉及线程间的交互;而 wait() 是线程间通信的重要手段,常用于生产者-消费者模型等同步场景。

总之,sleep() 更倾向于让线程简单地暂停执行一段时间,而 wait() 则是用于线程间协调和同步的关键工具,涉及到复杂的线程间通信和锁的管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值