一、wait方法概述
wait方法属于Object类中的方法,在使用wait方法时必须在同步化的方法或者同步化块中,同步化块的块对象就是wait方法属于的对象,即此处的Object。调用wait方法后,线程进入等待状态并且释放它所持有的锁,之后其他线程可以获得锁对象进入同步化块。当wait方法返回时,该线程会重新取得锁,并继续执行下去。
二、wait方法的使用步骤
1. 首先获取该对象的锁
2. 调用对象的wait()方法,此时该线程会进入到对象的等待池,释放对象的锁,只有等待其他线程调用对象的notify()方法,才会重新进入锁池等待取得对象的锁。
3. 等待被其他线程唤醒,如果没有被唤醒,一直处于等待状态。
4. 当被唤醒时,会重新尝试去获取对象的锁,如果获取不到,就继续在等待池中等待。
三、wait方法的示例
下面我们通过一段示例代码来演示wait方法的使用,代码中定义了两个线程对象WaitThread和NotifyThread,WaitThread调用了对象的wait方法,使得该线程进入等待状态。NotifyThread调用对象的notify方法,使得WaitThread重新取得锁,并继续执行。
public class WaitNotifyDemo { private static Object object = new Object(); public static void main(String[] args) { WaitThread waitThread = new WaitThread(); NotifyThread notifyThread = new NotifyThread(); waitThread.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } notifyThread.start(); } static class WaitThread extends Thread { @Override public void run() { synchronized (object) { System.out.println("WaitThread 获取到对象锁"); try { System.out.println("WaitThread 开始等待"); object.wait(); System.out.println("WaitThread 恢复执行"); } catch (InterruptedException e) { e.printStackTrace(); } } } } static class NotifyThread extends Thread { @Override public void run() { synchronized (object) { System.out.println("NotifyThread 获取到对象锁"); object.notify(); System.out.println("NotifyThread 执行notify方法"); } } } }运行该代码,输出如下:
WaitThread 获取到对象锁
WaitThread 开始等待
NotifyThread 获取到对象锁
NotifyThread 执行notify方法
WaitThread 恢复执行
从输出结果可以看到,WaitThread获取到锁并等待,NotifyThread调用notify方法后WaitThread才被唤醒并继续执行。如果没有NotifyThread调用notify方法,则WaitThread将一直处于等待状态。四、wait方法的注意事项
1. wait方法必须在同步化块中使用,否则会抛出IllegalMonitorStateException异常。
2. 如果在等待期间对象的notify方法被调用,但是该线程还未准备好执行,在下次调度时继续等待。
3. wait方法执行时,线程会释放它所持有的锁,但是并不会释放它所关联的对象的锁。
五、wait方法的总结
Java中的wait方法是一个用于线程等待的方法,并可以让线程释放它所持有的锁。在使用这个方法时必须在同步化的方法或者同步化块中,同步化块的块对象就是wait方法属于的对象,即此处的Object。注意,wait方法会释放它所持有的锁,但是并不会释放它所关联的对象的锁,而在等待期间被唤醒的线程需要重新获取它所关联的对象锁才能执行。