java多线程设计模式之生产者与消费者

本文介绍了一种使用Java实现的多线程生产者与消费者系统,包括Product类、ProductQueue类、ProducerThread类、ConsumerThread类和Main类。生产者线程负责创建并存入产品,消费者线程负责取出并消耗产品。系统中包含队列容量限制,确保生产与消费的平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java实现多线程生产者与消费者:

生产者线程负责生产产品,将产品保存到产品队列中,消费者负责从队列中取出产品消费。产品队列有一定的容量,当产品队列中没有产品时,消费者线程必须等待生产者线程生产产品,当产品队列中产品数量达到队列容量时,生产者等待消费者消费产品。
设计如下:
Product:产品类存储产品信息
ProductQueue:产品队列负责存储产品
ProducerThread:生产者线程负责生产产品
ConsumerThread:消费者线程负责消费产品
Main:程序入口

实现如下:
Product:产品类
package com.thread.product;

/**
* 产品类
* @author Administrator
*
*/
public class Product {


/**
* 产品名称
*/
private final String name;

public Product(String name){
this.name = name;
}

public String getName(){
return name;
}

public String toString(){
return "{product."+name+"}";
}

}


ProductQueue:产品队列类

package com.thread.product;

import java.util.LinkedList;

/**
* 产品队列类
* @author Administrator
*
*/
public class ProductQueue {

/**
* 存储产品的队列
*/
private final LinkedList<Product> products = new LinkedList<Product>();
/**
* 队列的容量大小
*/
private final int size;

public ProductQueue(int size){
this.size = size;
}

/**
* 向队列中添加产品,判断队列中产品大小是否达到了容量大小,
* 如果达到了当前生产线程等待,唤醒其他线程。
* 如果没有达到,当前生产线程向队列中添加产品。
* @param product
*/
public synchronized void putProduct(Product product){

while(products.size() > size){//判断队列中产品是否达到队列容量
try {
System.out.println(Thread.currentThread().getName()+" {putProduct wait}");
wait();//生产线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
products.addLast(product);//添加产品
System.out.println(Thread.currentThread().getName()+" putProduct "+product);
notifyAll();//唤醒其他等待线程
};


/**
* 获取队列中的产品,判断队列中是否存在产品,
* 如果没有则当前消费线程等待。
* 如果有则当前消费线程取出产品,唤醒其他等待线程。
* @return
*/
public synchronized Product getProduct(){

while(products.size() <= 0){//判断是否队列中是否存在产品
try {
System.out.println(Thread.currentThread().getName()+" {getProduct wait}");
wait();//消费线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Product product = products.removeFirst();//取出产品
System.out.println(Thread.currentThread().getName()+" getProduct "+product);
notifyAll();//唤醒其他线程
return product;
};

}

ProducerThread:生产者类

package com.thread.product;

import java.util.Random;

/**
* 生产产品线程类
* @author Administrator
*
*/
public class ProducerThread extends Thread{


private ProductQueue productQueue;
private Random random = new Random();

public ProducerThread(String name, ProductQueue queue){
super(name);
this.productQueue = queue;
}

/**
* 循环生产产品
*/
public void run(){
int count = 0;
while(true){
Product product = new Product("product."+count+"."+this.getName());
productQueue.putProduct(product);
count++;
try {
Thread.sleep(random.nextInt(1000));//随机休息
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

ConsumerThread:消费者类

package com.thread.product;

import java.util.Random;


/**
* 消费者线程类
* @author Administrator
*
*/
public class ConsumerThread extends Thread{


private ProductQueue productQueue;
private Random random = new Random();

public ConsumerThread(String name, ProductQueue queue){
super(name);
this.productQueue = queue;
}

/**
* 循环消费产品
*/
public void run(){
while(true){
productQueue.getProduct();
try {
Thread.sleep(random.nextInt(1400));//随机休息
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

Main:main类

package com.thread.product;

/**
* main类
* @author Administrator
*
*/
public class Main {

/**
*
* @param args
*/
public static void main(String[] args) {
//初始化产品队列容量为5
ProductQueue queue = new ProductQueue(5);
//启动两个生产产品线程实例,a和b
new ProducerThread("ProducerThread.a", queue).start();
new ProducerThread("ProducerThread.b", queue).start();
//启动两个消费者线程实例,a和b
new ConsumerThread("ConsumerThread.a", queue).start();
new ConsumerThread("ConsumerThread.b", queue).start();
}


}


执行结果:

ProducerThread.b putProduct {product.product.0.ProducerThread.b}
ProducerThread.a putProduct {product.product.0.ProducerThread.a}
ConsumerThread.a getProduct {product.product.0.ProducerThread.b}
ConsumerThread.b getProduct {product.product.0.ProducerThread.a}
ConsumerThread.b {getProduct wait}
ProducerThread.a putProduct {product.product.1.ProducerThread.a}
ConsumerThread.b getProduct {product.product.1.ProducerThread.a}
ConsumerThread.b {getProduct wait}
ConsumerThread.a {getProduct wait}
ProducerThread.a putProduct {product.product.2.ProducerThread.a}
ConsumerThread.a getProduct {product.product.2.ProducerThread.a}
ConsumerThread.b {getProduct wait}
ConsumerThread.a {getProduct wait}
ProducerThread.b putProduct {product.product.1.ProducerThread.b}
ConsumerThread.a getProduct {product.product.1.ProducerThread.b}
ConsumerThread.b {getProduct wait}
ProducerThread.b putProduct {product.product.2.ProducerThread.b}
ConsumerThread.b getProduct {product.product.2.ProducerThread.b}
ConsumerThread.b {getProduct wait}
ProducerThread.b putProduct {product.product.3.ProducerThread.b}
ConsumerThread.b getProduct {product.product.3.ProducerThread.b}
ProducerThread.a putProduct {product.product.3.ProducerThread.a}
ProducerThread.b putProduct {product.product.4.ProducerThread.b}
ProducerThread.a putProduct {product.product.4.ProducerThread.a}
ProducerThread.a putProduct {product.product.5.ProducerThread.a}
ConsumerThread.a getProduct {product.product.3.ProducerThread.a}
ProducerThread.b putProduct {product.product.5.ProducerThread.b}
ConsumerThread.b getProduct {product.product.4.ProducerThread.b}
ConsumerThread.b getProduct {product.product.4.ProducerThread.a}
ProducerThread.a putProduct {product.product.6.ProducerThread.a}
ConsumerThread.a getProduct {product.product.5.ProducerThread.a}
ProducerThread.a putProduct {product.product.7.ProducerThread.a}
ProducerThread.b putProduct {product.product.6.ProducerThread.b}
ProducerThread.a putProduct {product.product.8.ProducerThread.a}
ProducerThread.b putProduct {product.product.7.ProducerThread.b}
ConsumerThread.b getProduct {product.product.5.ProducerThread.b}
ConsumerThread.a getProduct {product.product.6.ProducerThread.a}
ProducerThread.a putProduct {product.product.9.ProducerThread.a}
ProducerThread.b putProduct {product.product.8.ProducerThread.b}
ConsumerThread.b getProduct {product.product.7.ProducerThread.a}
ProducerThread.a putProduct {product.product.10.ProducerThread.a}
ConsumerThread.a getProduct {product.product.6.ProducerThread.b}
ProducerThread.a putProduct {product.product.11.ProducerThread.a}
ConsumerThread.b getProduct {product.product.8.ProducerThread.a}
ConsumerThread.b getProduct {product.product.7.ProducerThread.b}
ProducerThread.b putProduct {product.product.9.ProducerThread.b}
ProducerThread.a putProduct {product.product.12.ProducerThread.a}
ConsumerThread.a getProduct {product.product.9.ProducerThread.a}
ConsumerThread.b getProduct {product.product.8.ProducerThread.b}
ProducerThread.b putProduct {product.product.10.ProducerThread.b}
ProducerThread.a putProduct {product.product.13.ProducerThread.a}
ProducerThread.b {putProduct wait}
ConsumerThread.a getProduct {product.product.10.ProducerThread.a}
ProducerThread.b putProduct {product.product.11.ProducerThread.b}
ProducerThread.a {putProduct wait}
ConsumerThread.b getProduct {product.product.11.ProducerThread.a}
ProducerThread.a putProduct {product.product.14.ProducerThread.a}
ProducerThread.b {putProduct wait}
ConsumerThread.a getProduct {product.product.9.ProducerThread.b}
ProducerThread.b putProduct {product.product.12.ProducerThread.b}
ConsumerThread.b getProduct {product.product.12.ProducerThread.a}
ProducerThread.a putProduct {product.product.15.ProducerThread.a}
ProducerThread.a {putProduct wait}
。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值