java等待唤醒机制
时间: 2023-11-10 21:01:18 浏览: 119
Java的等待唤醒机制是一种线程间的通信机制,用于实现线程之间的同步和协作。它通过使用Object类的wait()和notify()/notifyAll()方法来实现。
具体来说,当一个线程调用对象的wait()方法时,它会释放对象的锁并进入等待状态,直到其他线程调用相同对象的notify()或notifyAll()方法来唤醒它。被唤醒的线程将重新竞争对象的锁,并继续执行。
这种机制常用于解决生产者和消费者问题、线程间的任务分配和协作等多线程编程场景。
需要注意的是,wait()、notify()和notifyAll()方法必须在同步代码块中使用,即在调用这些方法之前必须获得对象的锁(通常是使用synchronized关键字)。
参考资料:
Java Concurrency in Practice. Brian Goetz et al.
https://docs.oracle.com/javase/tutorial/essential/concurrency/waitnotif.html
相关问题
实现线程等待唤醒机制的示例
以下是一个简单的线程等待唤醒机制的示例,其中包括一个生产者和一个消费者线程:
```java
public class WaitNotifyExample {
public static void main(String[] args) {
final Object lock = new Object();
final List<Integer> list = new ArrayList<>();
Thread producer = new Thread(() -> {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
list.add(i);
System.out.println("Produced: " + i);
lock.notify(); // 唤醒等待的线程
try {
lock.wait(); // 等待消费者线程唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread consumer = new Thread(() -> {
synchronized (lock) {
while (list.isEmpty()) {
try {
lock.wait(); // 等待生产者线程唤醒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < list.size(); i++) {
System.out.println("Consumed: " + list.get(i));
}
list.clear();
lock.notify(); // 唤醒等待的线程
}
});
producer.start();
consumer.start();
}
}
```
生产者线程通过`synchronized`关键字获取锁,然后在循环中生产数据并将其添加到列表中,然后使用`notify()`方法唤醒等待的线程,并使用`wait()`方法等待消费者线程唤醒。消费者线程也使用`synchronized`关键字获取锁,并在循环中等待列表中有数据。一旦列表中有数据,它将消费这些数据,清空列表,并使用`notify()`方法唤醒等待的线程。由于`synchronized`关键字在获取锁后自动释放锁,因此在等待期间,其他线程可以访问共享资源。
阅读全文