首页常见问题正文

sleep()和wait()有什么区别?

更新时间:2024-04-15 来源:黑马程序员 浏览量:

IT培训班

  在Java中,sleep()和wait()方法都可以用于线程的控制和调度,但它们有着不同的作用和使用场景。

  1.sleep()

  sleep()方法是Thread类的静态方法,用于暂停当前正在执行的线程一段指定的时间,让出CPU资源给其他线程执行。其签名如下:

public static void sleep(long millis) throws InterruptedException

  (1)参数millis表示要睡眠的时间长度,以毫秒为单位。

  (2)sleep()方法不会释放对象的锁。

  特点:

  (1)sleep()方法是静态方法,可以通过Thread.sleep()直接调用。

  (2)sleep()方法是线程级别的,即调用sleep()的线程会进入睡眠状态,不会释放锁,其他线程仍然无法访问同步方法或同步块。

  (3)sleep()方法可能会抛出InterruptedException异常,需要处理中断。

  适用场景:

  (1)用于暂时停止当前线程的执行,例如在某些情况下需要延迟执行一段时间后再继续执行。

  2.wait()

  wait()方法是Object类的方法,用于在某个对象上等待,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它,或者等待超时。其签名如下:

public final void wait() throws InterruptedException

  (1)调用wait()方法的线程必须拥有该对象的监视器(即在同步方法或同步块中调用)。

  (2)wait()方法会释放对象的锁。

  特点:

  (1)wait()方法必须在同步方法或同步块中调用,否则会抛出IllegalMonitorStateException异常。

  (2)wait()方法会使当前线程进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法,或者等待超时。

  (3)wait()方法会释放对象的锁,其他线程可以访问该对象的同步方法或同步块。

  (4)wait()方法可能会抛出InterruptedException异常,需要处理中断。

  适用场景:

  (1)用于线程间的协调,一个线程等待另一个线程的通知。

  (2)常与notify()和notifyAll()方法一起使用,实现线程间的同步和通信。

  总结:

  (1)sleep()方法用于线程睡眠,暂时停止当前线程的执行,不释放锁。

  (2)wait()方法用于线程等待,使当前线程进入等待状态,释放对象的锁。

  这两种方法在功能上有所重叠,但主要区别在于它们的使用场景和释放锁的行为。

分享到:
在线咨询 我要报名
和我们在线交谈!