Java中wait()和sleep()方法有何区别?

更新于
2026-08-07 15:57:56
16阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计614个文字,预计阅读时间需要3分钟。

Java中wait()和sleep()方法有何区别?

前言:最近在做一套题的时候,遇到了这个知识点,所以准备详细整理一下。

区别:sleep()方法是Thread类的静态方法,wait()方法是Object类的成员方法。

Java中wait()和sleep()方法有何区别?

sleep()方法:- 导致程序暂停执行指定的毫秒数。- 适用于使线程暂停一段时间,而不释放对同步监视器的占有。

wait()方法:- 会使当前线程等待,直到被同一对象的其他线程调用notify()或notifyAll()方法。- 适用于实现线程间的通信,通常用于多线程同步。

总结:sleep()方法导致程序暂停执行指定的毫秒数,而wait()方法使当前线程等待,直到被其他线程唤醒。


前言:
最近在做一套题的时候,遇到了这个知识点,所以准备详细整理一下。

区别

  • sleep方法是Thread类的静态方法、wait()是Object超类的成员方法。
  • sleep方法导致了程序暂停执行指定的时间,让出CPU给其他线程,但是它的监控状态依然保持着,当指定的时间到了又会地洞恢复运行状态。在调用sleep方法的过程中,线程不会释放对象锁。
    而当调用wait方法的时候,线程会自动释放对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。
  • sleep方法需要抛异常,wait方法不需要。
  • sleep方法可以在任何地方使用,而wait只能在同步方法和同步代码块中使用。
  • sleep方法是一个静态方法,也就是说它只对当前对象有效,通过t.sleep让t对象进入sleep,这样的做法是错误的,他只会是使当前线程被sleep而不是t线程。
  • 共同点

  • 他们都是在多线程的环境下,都是可以在程序的调用处阻塞指定的毫秒数,并返回。
  • wait和sleep都可以通过interrupt方法打断线程的暂停状态,从而使线程立刻抛出InterrruptedException。
    如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait()、sleep ()、join(),则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
    需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()、sleep()、join()后,就会立刻抛出InterruptedException 。

  • 本文共计614个文字,预计阅读时间需要3分钟。

    Java中wait()和sleep()方法有何区别?

    前言:最近在做一套题的时候,遇到了这个知识点,所以准备详细整理一下。

    区别:sleep()方法是Thread类的静态方法,wait()方法是Object类的成员方法。

    Java中wait()和sleep()方法有何区别?

    sleep()方法:- 导致程序暂停执行指定的毫秒数。- 适用于使线程暂停一段时间,而不释放对同步监视器的占有。

    wait()方法:- 会使当前线程等待,直到被同一对象的其他线程调用notify()或notifyAll()方法。- 适用于实现线程间的通信,通常用于多线程同步。

    总结:sleep()方法导致程序暂停执行指定的毫秒数,而wait()方法使当前线程等待,直到被其他线程唤醒。


    前言:
    最近在做一套题的时候,遇到了这个知识点,所以准备详细整理一下。

    区别

  • sleep方法是Thread类的静态方法、wait()是Object超类的成员方法。
  • sleep方法导致了程序暂停执行指定的时间,让出CPU给其他线程,但是它的监控状态依然保持着,当指定的时间到了又会地洞恢复运行状态。在调用sleep方法的过程中,线程不会释放对象锁。
    而当调用wait方法的时候,线程会自动释放对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备。
  • sleep方法需要抛异常,wait方法不需要。
  • sleep方法可以在任何地方使用,而wait只能在同步方法和同步代码块中使用。
  • sleep方法是一个静态方法,也就是说它只对当前对象有效,通过t.sleep让t对象进入sleep,这样的做法是错误的,他只会是使当前线程被sleep而不是t线程。
  • 共同点

  • 他们都是在多线程的环境下,都是可以在程序的调用处阻塞指定的毫秒数,并返回。
  • wait和sleep都可以通过interrupt方法打断线程的暂停状态,从而使线程立刻抛出InterrruptedException。
    如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait()、sleep ()、join(),则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
    需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()、sleep()、join()后,就会立刻抛出InterruptedException 。