设计产品类、生产者类和消费者类,生成相应类的对象,生产者和消费者同时对同一产品(多个)进行生产或消费,利用线程平衡生产和消费的过程。共享缓冲区最多可以放置4个产品,生产者A和生产者B各生产多个产品;消费者1、2、3每次可以取一个产品。,输出生产者、消费者的状态。Java
时间: 2024-12-08 11:18:06 浏览: 9
在Java中,我们可以创建一个基于并发和资源共享设计的产品生产者消费者模型,通常会使用`BlockingQueue`作为共享缓冲区,因为它的容量限制能够帮助控制生产和消费的同步。以下是一个简单的示例:
```java
import java.util.concurrent.*;
public class Product {
private String name;
// 构造函数,假设产品有名称
public Product(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Producer implements Runnable {
private BlockingQueue<Product> queue;
private int id;
public Producer(BlockingQueue<Product> queue, int id) {
this.queue = queue;
this.id = id;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep((long) (Math.random() * 1000)); // 模拟生产时间
Product product = new Product("Product " + id + "-" + i);
System.out.println("Producer " + id + ": Producing " + product.getName());
queue.put(product); // 生产产品并放入队列
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Consumer implements Runnable {
private BlockingQueue<Product> queue;
public Consumer(BlockingQueue<Product> queue) {
this.queue = queue;
}
@Override
public void run() {
while (!queue.isEmpty()) { // 当队列不为空时持续消费
try {
Product product = queue.take(); // 消费队列中的一个产品
System.out.println("Consumer: Consuming " + product.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class BufferPool {
private final BlockingQueue<Product> buffer = new ArrayBlockingQueue<>(4);
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建固定大小的线程池
// 添加生产者
executor.execute(new Producer(buffer, 0));
executor.execute(new Producer(buffer, 1));
// 添加消费者
for (int i = 1; i <= 3; i++) {
executor.execute(new Consumer(buffer));
}
executor.shutdown(); // 关闭线程池
}
}
```
在这个例子中:
- `Producer`类负责生产产品并将其放入缓冲区。
- `Consumer`类从缓冲区取出产品并消费。
- `BufferPool`初始化了缓冲区,并启动了多个生产者和消费者线程。
运行这个程序会输出生产者和消费者的状态,以及生产或消费的产品信息。由于线程调度和缓冲区容量限制,生产者和消费者之间的同步将自动完成。
阅读全文