一、什么是等待机制
等待机制指的是当一个线程需要等待某一条件满足时,它会进入一种等待状态,以便让其他线程有机会运行。这种等待状态是为了减少CPU资源的浪费,提高程序的效率。
在Java中,我们可以通过wait()、notify()和notifyAll()方法来实现等待机制。
二、wait()方法
wait()方法是Object类中的方法,它的作用是让当前线程释放锁,然后进入等待状态,直到其他线程使用notify()或notifyAll()方法唤醒它。
具体步骤如下:
1. 获取相应的锁; 2. 判断条件是否满足,如果不满足,则调用wait()方法进入等待状态,同时释放锁; 3. 条件满足时,调用notify()或notifyAll()方法唤醒等待的其他线程; 4. 唤醒后,当前线程重新获取锁,继续执行。
三、notify()和notifyAll()方法
notify()方法随机唤醒一个正在等待的线程,而notifyAll()方法则会唤醒所有正在等待的线程。
一般情况下,我们使用notifyAll()方法要比notify()方法更可靠,因为notify()方法可能会出现死锁的情况。
四、代码示例
下面是一个简单的示例,其中线程A等待线程B打印完毕后再执行:
public class WaitNotifyDemo { public static void main(String[] args) throws Exception { final Object lock = new Object(); Thread threadA = new Thread(() -> { synchronized (lock) { System.out.println("Thread A is waiting for lock."); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread A finished."); } }); Thread threadB = new Thread(() -> { synchronized (lock) { System.out.println("Thread B is running."); System.out.println("Thread B is finished."); lock.notify(); } }); threadA.start(); Thread.sleep(1000); threadB.start(); } }
执行结果如下:
Thread A is waiting for lock. Thread B is running. Thread B is finished. Thread A finished.
可以看到,线程A在等待线程B打印完毕后才执行,最终输出了“Thread A finished.”。
五、总结
Java等待机制是Java多线程编程中一个非常重要的方面,它通过wait()、notify()和notifyAll()方法实现线程之间的协作,避免了资源的浪费和程序的效率问题。在使用等待机制时,要注意线程的同步和锁的释放,以免出现死锁等问题。