欢迎访问宙启技术站
智能推送

使用wait()函数进行线程间的同步操作示例

发布时间:2024-01-02 15:36:40

使用wait()函数进行线程间的同步操作示例:

在Java中,wait()函数是Object类的一个方法,用于线程间的同步操作。它会让线程暂停执行,并释放持有的锁,直到其他线程调用了notify()或notifyAll()方法来唤醒它。wait()函数通常和synchronized关键字一起使用,保证线程的安全性。

下面我们通过一个简单的例子来演示wait()函数的使用。

public class WaitExample {
    public static void main(String[] args) {
        final Object lock = new Object();

        Thread thread1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 1 is waiting...");
                    lock.wait(); // 线程1等待
                    System.out.println("Thread 1 is resumed.");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 2 is running.");
                    Thread.sleep(2000);
                    lock.notify(); // 唤醒等待的线程1
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

在这个例子中,我们创建了两个线程:thread1和thread2。thread1使用wait()函数暂停执行,并等待被唤醒,而thread2会在2秒后调用notify()方法来唤醒thread1。

使用synchronized关键字将lock对象作为锁,确保线程之间的同步操作。在线程1中,首先打印"Thread 1 is waiting...",然后调用lock.wait()函数,线程1会暂停执行,并释放持有的锁。

在线程2中,首先打印"Thread 2 is running.",然后调用Thread.sleep(2000)方法,使线程2暂停2秒。接着调用lock.notify()方法,唤醒等待的线程1。

运行这个例子,可以看到输出如下:

Thread 1 is waiting...
Thread 2 is running.
Thread 1 is resumed.

从输出中可以看到,线程1首先等待被唤醒,然后线程2执行,2秒后唤醒了线程1,线程1继续执行。

这个例子展示了wait()函数的基本用法,通过wait()和notify()方法的配合,线程间可以实现简单的同步操作。注意,在调用wait()函数之前,必须先获取对象的锁,并且wait()函数必须在synchronized代码块或方法中调用。

除了wait()函数,Java还提供了wait(long timeout)和wait(long timeout, int nanos)函数,允许设定等待的时间。wait(timeout)会使线程暂停执行,直到被唤醒或等待时间超过timeout,而wait(timeout, nanos)除了等待时间外,还可以指定纳秒数。

总结起来,wait()函数是实现线程间同步操作的重要方法之一。它可以让线程进入等待状态,直到其他线程调用notify()或notifyAll()方法来进行唤醒。使用wait()函数可以有效避免线程间的竞争条件,提高程序的安全性和可靠性。