问题
wait() 方法和 sleep() 方法都能让当前线程挂起一段时间,那它们的区别是什么?
解析
wait()
方法和 sleep()
方法确实都能使当前线程暂停执行,但它们之间存在几个关键区别:
-
所属类:
wait()
是Object
类的方法,而sleep()
是Thread
类的静态方法。 -
锁的处理:当线程执行
wait()
方法时,它会释放对象的锁,这允许其他线程进入同步代码块或调用同一个对象的其他被同步的方法。相反,当线程执行sleep()
方法时,它不会释放任何锁。 -
唤醒条件:
wait()
通常与notify()
或notifyAll()
方法一起使用,这些方法被用于唤醒等待的线程。而sleep()
只在指定的时间过去后自动唤醒。 -
异常处理:
wait()
必须在同步块或同步方法中使用,因此如果线程持有多个锁,它只会释放调用wait()
的对象的锁。同时,wait()
、notify()
和notifyAll()
都会抛出InterruptedException
。而sleep()
只会在中断时抛出InterruptedException
。 -
使用场景:
sleep()
主要用于让线程暂停执行一段时间。而wait()
主要用于线程间通信,它等待特定条件的发生(通常是另一个线程调用notify()
或notifyAll()
)。
总结来说,sleep()
是一个线程控制工具,用于暂停线程执行,而不释放任何锁;而 wait()
是线程间通信的机制,当一个线程在对象上调用 wait()
后,它会释放该对象的锁,直到另一个线程在该对象上调用 notify()
或 notifyAll()
。