生产者消费者模式
初学者、小白通用
傻瓜式使用
好多人的代码对初学者不友好,我重写了一个。Ctrl+C,Ctrl+V直接使用。
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class Test {
public static void main(String[] args) {
int i=0;//统计生产总数 只有一个生产者不用考虑线程安全
ProductHouse productHouse=new ProductHouse();//仓库
Proudcters proudcters=new Proudcters(productHouse,i);//生产者
Customer customer=new Customer(productHouse);//顾客1
Customer customer2=new Customer(productHouse);//顾客2
proudcters.start();//生产者启动
customer.start();//顾客1
customer2.start();//顾客2
}
}
class Product//产品
{
private int id;//给产品一个唯一ID,方便观察记录
public Product(int id)
{
this.id=id;
}
public void setId(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
class ProductHouse
{
private Vector<Product> list=new Vector<Product>();//用线程安全的数组作为仓库存放产品
private int lenthen;
final private int max=100;//数组的最大长度
public void ProductHouse()
{
}
public int getLenthen() {
return lenthen=list.size();
}
public synchronized void push(Product product)//将产品放入仓库的方法,线程安全
{
System.out.println("存放");
while (list.size()>=max)//当数组长度达到最大时等待
{
System.out.println("生产等待"+list.size());
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("异常");
}
}
list.add(product);//在仓库里添加产品
this.notifyAll();//当仓库里添加产品时,叫一下正在等待消费者,让他们来消费。
}
public synchronized Product Pop()//将产品消费(取出)的方法
{
Product product;
while (list.size()==0)//当仓库里没产品的时候等待
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (list.size()<20)//当仓库里的产品教少的时候叫一下生产者
{
this.notifyAll();
}
System.out.println("仓库里有"+list.size()+"个产品");
product=list.get(list.size()-1);
list.remove(list.size()-1);
return product;
}
}
class Proudcters extends Thread//生产者对象
{
private ProductHouse productHouse; //生产者要有一个能放产品的ID
private int i;//生产者要有一个能给产品分发ID 的ID
public Proudcters(ProductHouse productHouse,int i)
{
this.productHouse=productHouse;
this.i=i;
}
@Override
public void run()
{
while(true) {
Product product = new Product(i);//生产产品
System.out.println("生产的产品ID为" + i);
productHouse.push(product);//把产品放入仓库
i++;
}
}
}
class Customer extends Thread
{
private ProductHouse productHouse;
private Product product;
public Customer(ProductHouse productHouse)
{
this.productHouse=productHouse;
}
@Override
public void run()
{
while (true) {
product=productHouse.Pop();
System.out.println("消费的产品ID为:"+product.getId());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}