Java中的notify方法是用来唤醒由wait方法阻塞的线程。在多线程编程中,经常需要控制线程的执行顺序,以保证数据的正确性和一致性。notify方法的实现机制是通过线程对象的monitor进行通信的。
当一个线程调用了对象的wait方法后,该线程会被阻塞,并释放对monitor对象的锁定,进入到等待状态。同时,其它线程如果调用了该对象的notify方法,就会唤醒一个正在等待的线程。被唤醒的线程将会重新竞争monitor对象的锁,如果获得锁,就可以继续执行。
下面是一个简单示例,展示了如何使用Java的notify方法:
// 定义一个共享对象 public class SharedObject { private boolean flag = false; // 获取共享对象的锁 public synchronized void waitForFlag() { while (!flag) { try { wait(); // 当前线程等待,在这里会释放锁 } catch (InterruptedException e) { e.printStackTrace(); } } // 执行需要等待的操作... } // 通知等待的线程继续执行 public synchronized void setFlag() { this.flag = true; notify(); // 唤醒一个等待的线程,使其继续执行 } } // 使用示例 public class Main { public static void main(String[] args) { SharedObject sharedObject = new SharedObject(); Thread thread1 = new Thread(() -> { sharedObject.waitForFlag(); System.out.println("Thread 1 completed."); }); Thread thread2 = new Thread(() -> { System.out.println("Thread 2 started."); sharedObject.setFlag(); // 唤醒等待的线程 }); thread1.start(); thread2.start(); } }
在上面的示例中,我们定义了一个共享对象SharedObject,并使用synchronized关键字来获取共享对象的锁。在waitForFlag方法中,线程会在while循环中一直等待,直到flag变为true。调用wait方法后,当前线程会释放共享对象的锁,并进入等待状态。在setFlag方法中,我们将flag设置为true,并调用notify方法唤醒在等待的线程。当线程被唤醒后,它将重新竞争共享对象的锁,如果获得锁,就可以继续执行。
总结起来,Java的notify方法通过线程的monitor实现了线程间的通信和控制。它的调用可以唤醒一个正在等待的线程,使其继续执行。通过合理使用notify方法,我们可以实现多线程编程中的线程协作和同步。