使用代码展示一下await()方法锁住对象之后使用notify()方法解锁的过程
时间: 2023-12-12 09:02:03 浏览: 28
好的,下面是一个简单的例子,演示了await()方法锁住对象之后,使用notify()方法解锁的过程:
```java
import java.util.concurrent.CountDownLatch;
public class Example {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(1); // 创建一个CountDownLatch对象
// 创建一个线程,在该线程中调用await()方法等待唤醒
new Thread(new Runnable() {
@Override
public void run() {
try {
synchronized (latch) { // 获取CountDownLatch对象的锁
System.out.println("Thread A is waiting...");
latch.wait(); // 调用await()方法等待唤醒
System.out.println("Thread A is done.");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 创建一个线程,在该线程中调用notify()方法唤醒等待线程
new Thread(new Runnable() {
@Override
public void run() {
synchronized (latch) { // 获取CountDownLatch对象的锁
System.out.println("Thread B is notifying...");
latch.notify(); // 调用notify()方法唤醒等待线程
}
}
}).start();
}
}
```
在上面的例子中,我们创建了一个CountDownLatch对象,并将计数器初始化为1。然后创建了两个线程,其中一个线程调用await()方法等待唤醒,而另一个线程调用notify()方法唤醒等待线程。
在调用await()方法时,该线程获取了CountDownLatch对象的锁,并释放了锁,然后进入等待状态。在调用notify()方法时,另一个线程获取了CountDownLatch对象的锁,并通知等待线程,该线程被唤醒并重新获取了锁,最后执行完成。
需要注意的是,在同步代码块中调用wait()方法和notify()方法时,必须获取相同对象的锁,否则会抛出IllegalMonitorStateException异常。在上面的例子中,我们都是通过synchronized代码块来获取CountDownLatch对象的锁。