Java
Wait()和Sleep ()的区别
00 分钟
2024-9-27
2024-10-21
type
status
date
slug
summary
tags
category
icon
在Java中,wait()和sleep()都是用于控制线程行为的方法,但它们之间有着显著的差异。以下是它们之间的主要区别:
  1. 所属类和方法签名
  • wait():是Object类的一个方法。它是用于线程间通信的,因此与对象的监视器(monitor)紧密相关。它有三种重载形式:wait(), wait(long timeout), wait(long timeout, int nanos)。
  • sleep():是Thread类的一个静态方法。它仅用于使当前线程休眠一段时间,不接受任何与对象监视器相关的参数。它有两种重载形式:sleep(long millis), sleep(long millis, int nanos)。
  1. 是否需要持有对象的监视器锁
  • wait():调用wait()的线程必须持有对象的监视器锁(通常是通过synchronized块或方法获得的)。如果没有持有锁,会抛出IllegalMonitorStateException。
  • sleep():不需要持有任何对象的监视器锁,可以在任何线程状态下调用。
  1. 释放锁的行为
  • wait():调用wait()的线程会释放它持有的对象的监视器锁,并等待其他线程调用notify()或notifyAll()来唤醒它。当线程被唤醒后,它需要重新获取对象的监视器锁才能继续执行。
  • sleep():调用sleep()的线程只是简单地使当前线程休眠一段时间,不会释放任何锁。
  1. 响应中断
  • wait():如果调用wait()的线程在等待时被中断(通过调用Thread.interrupt()),它会清除中断状态(即将中断状态标志设置为false),并抛出InterruptedException。
  • sleep():如果调用sleep()的线程在等待时被中断,它会清除中断状态并抛出InterruptedException。
  1. 用途
  • wait()和notify()/notifyAll():通常用于线程间的通信,实现生产者-消费者模式、等待/通知模式等。
  • sleep():通常用于让线程休眠一段时间,如等待某个条件成立或简单的延时。
  1. 唤醒方式
  • wait():只能通过其他线程调用该对象的notify()或notifyAll()方法来唤醒。
  • sleep():等待指定的时间后自动唤醒,或者通过中断来唤醒。
总结:wait()和sleep()虽然都用于控制线程的行为,但它们在用途、是否需要持有锁、释放锁的行为、响应中断的方式以及唤醒方式上都有显著的差异
上一篇
Java常见集合
下一篇
基本数据类型和引用数据类型