Java中的线程间通信:wait()方法、notify()方法、notifyAll()方法

本文将介绍Java中的线程间通信:wait()方法、notify()方法、notifyAll()方法,并提供具体的代码案例,适合编程小白学习。通过本文的学习,你将能够更好地理解Java中线程通信的原理和实现方式。


1. wait()方法

wait()方法是Object类中的方法,用于使当前线程进入等待状态,直到另一线程调用notify()或notifyAll()方法唤醒该线程。

wait()方法的语法如下:

public final void wait() throws InterruptedException

其中,wait()方法不带任何参数,调用该方法的线程将一直等待,直到其他线程调用notify()或notifyAll()方法唤醒它。

下面是一个wait()方法的示例:

synchronized (lock) {
    while (condition) {
        lock.wait();
    }
    // do something
}

在上面的示例中,调用wait()方法的线程将一直等待,直到其他线程调用notify()或notifyAll()方法唤醒它。


2. notify()方法

notify()方法是Object类中的方法,用于唤醒一个在等待状态中的线程。如果有多个线程在等待,只有其中一个线程会被唤醒。

notify()方法的语法如下:

public final void notify()

下面是一个notify()方法的示例:

synchronized (lock) {
    condition = false;
    lock.notify();
}

在上面的示例中,调用notify()方法将唤醒一个在等待状态中的线程。


3. notifyAll()方法

notifyAll()方法是Object类中的方法,用于唤醒所有在等待状态中的线程。

notifyAll()方法的语法如下:

public final void notifyAll()

下面是一个notifyAll()方法的示例:

synchronized (lock) {
    condition = false;
    lock.notifyAll();
}

在上面的示例中,调用notifyAll()方法将唤醒所有在等待状态中的线程。


4. 示例代码

下面是一个使用wait()、notify()和notifyAll()方法实现线程间通信的示例代码:

public class ThreadCommunication {
    public static void main(String[] args) {
        Object lock = new Object();
        boolean condition = true;
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                while (condition) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("Thread 1 is running.");
            }
        });
        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                while (condition) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("Thread 2 is running.");
            }
        });
        t1.start();
        t2.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized (lock) {
            condition = false;
            lock.notifyAll();
        }
    }
}

在上面的示例代码中,我们创建了两个线程t1和t2,这两个线程都会等待condition变量的改变。在主线程中,我们将condition变量的值改变,并调用lock.notifyAll()方法,唤醒等待的线程t1和t2。

猿教程
请先登录后发表评论
  • 最新评论
  • 总共0条评论