详解Java的notify()方法:唤醒在当前对象上等待的一个线程

  • Post category:Java

下面我会详细讲解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()方法来唤醒所有等待的线程。