wait与notify
wait与notify
在Java中,wait()和notify()是Object类中的两个方法,用于实现线程之间的协作和通信,需要在synchronized块中使用。它们的作用如下:
- wait()方法:让当前线程进入等待状态,释放对象锁,并等待其他线程调用notify()或notifyAll()方法来唤醒它。wait()方法有以下两种形式:
- public final void wait() throws InterruptedException:让当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法唤醒它,或者当前线程被中断抛出InterruptedException异常。
- public final void wait(long timeout) throws InterruptedException:让当前线程进入等待状态,最多等待timeout毫秒,如果在这个时间内没有被唤醒,将自动恢复运行。
- notify()方法:唤醒等待在对象上的一个线程,如果有多个线程在等待,则唤醒其中一个线程,具体唤醒哪个线程是不确定的。notify()方法只能在synchronized块中调用,并且必须先获取对象锁。
使用wait()和notify()方法可以实现线程间的协作和通信,其中wait()方法负责等待并释放锁,notify()方法负责唤醒等待的线程。通常情况下,wait()和notify()方法的使用方式如下:
- 在synchronized块中,使用while循环等待条件的满足,而不是使用if语句,以避免虚假唤醒。
- 当条件满足时,调用notify()方法唤醒等待的线程。
- 在唤醒等待线程之后,需要重新判断条件是否满足,如果不满足,则继续等待。
- 在wait()和notify()方法中,需要使用synchronized块来保护对象的状态,以避免多线程访问的竞争和一致性问题。
需要注意的是,wait()和notify()方法必须在synchronized块中使用,因为它们需要获取对象锁来实现线程之间的通信。同时,wait()和notify()方法的调用顺序也很重要,否则可能会出现死锁或线程饥饿等问题。因此,在使用wait()和notify()方法时,需要仔细设计线程之间的协作和通信机制,以保证程序的正确性和可靠性。