Java中wait()和sleep()的区别

1. 所属类和用途

  • wait()
    • 所属类:Object类。
    • 用途:主要用于线程间的通信和同步wait()notify()/notifyAll()方法必须与synchronized关键字一起使用,以确保线程间的同步(线程之间必须按照特定的顺序执行)。当线程调用某个对象的wait()方法时,它会释放该对象上的锁并进入等待状态,直到其他线程调用该对象的notify()notifyAll()方法将其唤醒,或者等待时间超时(如果调用了带超时的wait(long timeout)方法)。
  • sleep()
    • 所属类:Thread类。
    • 用途:主要用于暂停当前线程的执行一段时间,让出CPU资源给其他线程使用。它不涉及线程间的通信,仅仅是让线程暂停执行。

2. 对锁的处理

  • wait()
    • 调用wait()方法时,当前线程必须持有该对象的锁。调用后,线程会释放该锁进入等待状态。当线程被唤醒并准备重新执行时,它需要重新获取该对象的锁
  • sleep()
    • sleep()方法不会释放当前线程所持有的任何锁。即使线程在睡眠期间被暂停执行,它所持有的锁仍然保持有效,其他线程无法进入该锁保护的同步代码块。

3. 使用范围

  • wait()
    • 必须在同步方法或同步代码块内部调用,因为它涉及到线程间的通信和锁的释放。
  • sleep()
    • 可以在任何地方调用,无需同步代码块的支持。它仅仅是让当前线程暂停执行一段时间,不涉及线程间的通信或锁的管理。

4. 唤醒机制

  • wait()
    • 线程调用wait()方法后会进入等待状态,直到其他线程调用该对象的notify()notifyAll()方法将其唤醒。如果没有其他线程唤醒它,它将一直等待下去(除非设置了超时时间)。
  • sleep()
    • 线程调用sleep()方法后会暂停执行指定的时间,然后自动苏醒并继续执行后续的代码。它不需要其他线程的干预来唤醒。

5. 异常处理

  • wait()
    • wait()方法在调用时不需要捕获异常,但如果在等待过程中线程被中断(即调用了线程的interrupt()方法),则会抛出InterruptedException异常。
  • sleep()
    • sleep()方法在调用时必须捕获InterruptedException异常,因为如果在睡眠过程中线程被中断,则会抛出此异常。

6. 返回值

  • wait()
    • wait()方法没有返回值。
  • sleep()
    • sleep()方法本身不返回任何值,但会抛出InterruptedException异常。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值