使用wait方法、notify方法和线程同步,实现“生产者和消费者模型”, 自行设定:生产和消费的具体内容。
时间: 2023-06-13 14:06:23 浏览: 86
生产者和消费者模型是一种常见的并发编程模型,可以用于解决多线程并发访问共享资源时的同步问题。在此模型中,生产者线程负责生产数据并将其放入共享缓冲区中,而消费者线程则负责从缓冲区中取出数据进行消费。为了避免生产者和消费者之间的竞争条件,需要使用线程同步机制来保证缓冲区的安全访问。
以下是一个简单的生产者和消费者模型的示例,其中生产者线程生产整数,并将它们放入共享缓冲区中,而消费者线程从缓冲区中取出整数并打印它们:
```java
import java.util.LinkedList;
import java.util.Queue;
public class ProducerConsumerExample {
private static final int BUFFER_SIZE = 10;
private static final Queue<Integer> buffer = new LinkedList<>();
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread producer = new Thread(() -> {
int i = 0;
while (true) {
synchronized (lock) {
// 如果缓冲区已满,则等待
while (buffer.size() == BUFFER_SIZE) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产一个整数并放入缓冲区
buffer.offer(i++);
System.out.println("Produced: " + i);
// 通知消费者线程可以从缓冲区中取出数据了
lock.notifyAll();
}
Thread.sleep(1000);
}
});
Thread consumer = new Thread(() -> {
while (true) {
synchronized (lock) {
// 如果缓冲区为空,则等待
while (buffer.isEmpty()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 从缓冲区中取出一个整数并打印
int i = buffer.poll();
System.out.println("Consumed: " + i);
// 通知生产者线程可以往缓冲区中放入数据了
lock.notifyAll();
}
Thread.sleep(1000);
}
});
producer.start();
consumer.start();
producer.join();
consumer.join();
}
}
```
在上述代码中,我们使用了一个共享的缓冲区来存储整数,缓冲区的大小为10。我们使用了一个Object类型的锁来进行线程同步,同时使用了wait()和notifyAll()方法来实现线程之间的通信。
在生产者线程中,我们使用了一个while循环来不断地生产整数,并将它们放入缓冲区中。如果缓冲区已满,则调用wait()方法进入等待状态,直到消费者线程从缓冲区中取出一个整数后通知生产者线程可以继续生产数据。在生产一个整数并放入缓冲区后,我们使用notifyAll()方法通知消费者线程可以从缓冲区中取出数据了。
在消费者线程中,我们使用了一个while循环来不断地从缓冲区中取出整数,并打印它们。如果缓冲区为空,则调用wait()方法进入等待状态,直到生产者线程往缓冲区中放入一个整数后通知消费者线程可以继续取出数据。在取出一个整数并打印后,我们使用notifyAll()方法通知生产者线程可以往缓冲区中放入数据了。
在main()方法中,我们创建了一个生产者线程和一个消费者线程,并启动它们。我们使用join()方法等待两个线程执行完毕后退出程序。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)