Java 中 sleep 方法和 wait 方法的区别是什么?
Java 中的 sleep
方法和 wait
方法都是用来暂停线程的执行,但它们之间存在几个关键的区别:
-
所属类和调用方式:
sleep
方法属于Thread
类,可以在任何地方调用;而wait
方法属于Object
类,需要在synchronized
块或方法中调用。这意味着sleep
方法可以在任何线程中使用,而wait
方法则需要在对象的同步上下文中使用。136101516 -
锁的释放:
sleep
方法不会释放锁,即使在同步块中调用,它也不会让其他线程进入该同步块。相反,wait
方法会释放当前线程持有的锁,允许其他线程进入同步块或方法。711141516 -
线程间通信:
wait
方法是用于线程间通信的,它通常与notify
和notifyAll
方法一起使用,以实现线程间的协调和通信。而sleep
方法则主要用于短时间暂停当前线程,不涉及线程间的通信。1215 -
异常处理:使用
sleep
方法时,需要捕获InterruptedException
异常,因为线程在休眠期间可能会被中断。而wait
方法也会抛出InterruptedException
,但除此之外,它还必须在synchronized
块中使用,这意味着它与对象的锁定状态有关。41418 -
语法使用:
sleep
方法有一个重载版本,接受一个表示毫秒数的参数,而wait
方法也有一个接受超时时间参数的重载版本。wait
方法必须配合synchronized
关键字一起使用,而sleep
方法则没有这个要求。218 -
响应中断:
sleep
和wait
方法都可以响应中断信号。如果在休眠或等待期间线程接收到中断信号,它们都会抛出InterruptedException
异常。18
通过合理使用 sleep
和 wait
方法,可以更好地控制线程的执行顺序和线程间的协调,从而提高程序的效率和稳定性。17
wait()方法属于Object类,需要在synchronized块或方法中调用1 | wait()调用条件 wait()必须在同步块或方法中调用。 |
sleep()方法属于Thread类,可以在任何地方调用1 | sleep()调用自由度 sleep()可在任何地方被调用。 |
sleep()是Thread类的静态方法,可以直接调用3 | sleep()静态属性 sleep()作为静态方法可直接调用。 |
wait()是Object类的实例方法,必须在同步块或同步方法中调用3 | wait()同步要求 wait()需在同步上下文中调用。 |
sleep()方法没有释放锁,而wait()方法释放了锁7 | 锁的控制差异 sleep()不释放锁,wait()释放锁。 |
wait(), notify和notifyAll只能在同步控制方法或者同步控制块里面使用15 | wait()方法使用限制 只能在同步控制区域内使用。 |
Thread.sleep() 2 | 线程休眠 使当前线程暂停执行指定毫秒数,不释放锁。 |
Object.wait() 6 | 线程等待 在同步块中调用,释放锁,允许其他线程进入同步块。 |
sleep()方法2 | 线程休眠 属于Thread类,可让当前线程暂停执行指定毫秒数,不释放锁。 |
wait()方法6 | 线程等待 是Object类中的native方法,调用时释放锁,允许其他线程进入同步块。 |