目录
一、sleep()和wait()的区别
1、相同点
- 一、sleep()和wait()的区别
- 1、相同点
- 2、不同点
- 二、使用wait(),notify(),notifyAll()的注意事项
- 三、wait()和notify()的工作原理
- sleep()和wait()都可以暂停线程的执行。
-
所在类不同 sleep()是Thread类的静态方法。 wait()是Object类的方法。
-
锁释放不同 sleep()是不释放锁的。 wait()是释放锁的。
-
用途不同 sleep()常用于一定时间内暂停线程执行。 wait()常用于线程间交互和通信。
-
用法不同 sleep()方法睡眠指定时间之后,线程会自动苏醒。 wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。
- 当一个线程需要调用对象的wait0方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。
- 同样的,当—个线程需要调用对象的 notity()方法之前,也要先获得对象锁,执行完毕后,释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。
- 如果线程A1,A2,A3,A4都调用了obj.wait()方法,那么它们就会进入obj对象的等待队列。当obj.notify()被调用的时候,会从等待队列中随机选择一个线程并将其唤醒。而如果调用obj.notifyAll(),则会唤醒等待队列中的所有等待线程。如下图所示: