使用wait()函数进行线程间的同步操作示例
使用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()函数可以有效避免线程间的竞争条件,提高程序的安全性和可靠性。
