下面我会详细讲解Java的notify()方法的使用攻略。
Java的notify()方法介绍
Java中,notify()方法是Object类中的一个实例方法,它的作用是唤醒一个在此对象监视器(monitor)上等待的线程。如果有多个线程在此对象上等待,则只能唤醒其中一个线程。
以下是notify()方法的定义:
public final void notify()
notify()方法的调用必须在同步方法或同步块中进行。
Java的notify()方法使用示例
示例一
下面的示例演示了使用一个对象的notify()方法唤醒线程:
// 定义一个对象
Object obj = new Object();
// 创建一个线程,并让线程等待在obj对象上
Thread waitThread = new Thread(() -> {
synchronized(obj){
try {
System.out.println("线程开始等待...");
obj.wait(); // 线程等待在obj对象上
System.out.println("线程被唤醒了。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
waitThread.start(); // 启动线程
// 休眠1秒钟,确保线程已经进入等待状态
Thread.sleep(1000);
// 在主线程中调用notify()方法,唤醒等待中的线程
synchronized(obj){
obj.notify(); // 唤醒正在等待的线程
}
运行以上代码,你会看到输出:
线程开始等待...
线程被唤醒了。
在这个例子中,我们创建了一个线程waitThread,它在一个对象obj上等待。然后在主线程中调用obj的notify()方法来唤醒waitThread线程。
示例二
下面的示例演示了在多个线程中使用对象的notify()方法的情况:
// 定义一个对象
Object obj = new Object();
// 创建两个线程,并让它们等待在obj对象上
Thread waitThread1 = new Thread(() -> {
synchronized(obj){
try {
System.out.println("线程1开始等待...");
obj.wait(); // 线程1等待在obj对象上
System.out.println("线程1被唤醒了。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread waitThread2 = new Thread(() -> {
synchronized(obj){
try {
System.out.println("线程2开始等待...");
obj.wait(); // 线程2等待在obj对象上
System.out.println("线程2被唤醒了。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
waitThread1.start(); // 启动线程1
waitThread2.start(); // 启动线程2
// 休眠1秒钟,确保线程已经进入等待状态
Thread.sleep(1000);
// 在主线程中调用notify()方法,唤醒其中一个线程
synchronized(obj){
obj.notify(); // 唤醒正在等待的一个线程
}
// 再次休眠1秒钟,确保线程已经被唤醒
Thread.sleep(1000);
// 再次调用notify()方法,唤醒另一个线程
synchronized(obj){
obj.notify(); // 唤醒正在等待的另一个线程
}
在上面的示例中,我们创建了两个线程waitThread1和waitThread2,它们都在一个对象obj上等待。然后在主线程中,我们先调用一次obj的notify()方法,唤醒其中一个线程,然后再调用一次obj的notify()方法,唤醒另一个线程。运行以上代码,你会看到输出:
线程1开始等待...
线程2开始等待...
线程1被唤醒了。
线程2被唤醒了。
这个示例中,我们演示了在多个线程中使用notify()方法的情况,我们调用两次notify()方法唤醒了等待中的两个线程。
结语
notify()方法和wait()方法是Java中线程同步的重要组成部分,它们可以让我们实现线程的通信和协作。在使用notify()方法的时候,我们需要注意它只能唤醒一个等待的线程,如果有多个线程在等待,我们需要使用notifyAll()方法来唤醒所有等待的线程。