type
status
date
slug
summary
tags
category
icon
在Java中,wait()和sleep()都是用于控制线程行为的方法,但它们之间有着显著的差异。以下是它们之间的主要区别:
- 所属类和方法签名:
- wait():是Object类的一个方法。它是用于线程间通信的,因此与对象的监视器(monitor)紧密相关。它有三种重载形式:wait(), wait(long timeout), wait(long timeout, int nanos)。
- sleep():是Thread类的一个静态方法。它仅用于使当前线程休眠一段时间,不接受任何与对象监视器相关的参数。它有两种重载形式:sleep(long millis), sleep(long millis, int nanos)。
- 是否需要持有对象的监视器锁:
- wait():调用wait()的线程必须持有对象的监视器锁(通常是通过synchronized块或方法获得的)。如果没有持有锁,会抛出IllegalMonitorStateException。
- sleep():不需要持有任何对象的监视器锁,可以在任何线程状态下调用。
- 释放锁的行为:
- wait():调用wait()的线程会释放它持有的对象的监视器锁,并等待其他线程调用notify()或notifyAll()来唤醒它。当线程被唤醒后,它需要重新获取对象的监视器锁才能继续执行。
- sleep():调用sleep()的线程只是简单地使当前线程休眠一段时间,不会释放任何锁。
- 响应中断:
- wait():如果调用wait()的线程在等待时被中断(通过调用Thread.interrupt()),它会清除中断状态(即将中断状态标志设置为false),并抛出InterruptedException。
- sleep():如果调用sleep()的线程在等待时被中断,它会清除中断状态并抛出InterruptedException。
- 用途:
- wait()和notify()/notifyAll():通常用于线程间的通信,实现生产者-消费者模式、等待/通知模式等。
- sleep():通常用于让线程休眠一段时间,如等待某个条件成立或简单的延时。
- 唤醒方式:
- wait():只能通过其他线程调用该对象的notify()或notifyAll()方法来唤醒。
- sleep():等待指定的时间后自动唤醒,或者通过中断来唤醒。
总结:wait()和sleep()虽然都用于控制线程的行为,但它们在用途、是否需要持有锁、释放锁的行为、响应中断的方式以及唤醒方式上都有显著的差异
- 作者:BOB
- 链接:https://hb2001.vercel.app/article/96feb3dd-7fb4-432c-881f-b5fd633842dd
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。