Java知识点,线程——生产者与消费者问题

@TOCJava中线程知识点

生产与消费者问题

问题需求:
1、生产者与消费者之间存在“中间地带”,可以命名为缓冲区,
2、缓冲区具有固定的存储容量,生产者需要生产的数量大于缓冲 区剩余容量,优先满足生产需求,剩余未完成数量待缓冲区有容量时继续生产,缓冲区没有容量时,不允许生产。
3、消费者者需要消费的数量大于缓冲区现存商品,优先满足消费需求,剩余未消费数量待缓冲区有商品时消费,缓冲区没有商品时,不允许生产。

实现过程

缓冲区代码

package thread;

import java.util.ArrayList;
import java.util.List;

public class Stroage {
private List list = new ArrayList<>();
private final int MAX_SIZE = 200;

//生产者
public void produceor(int num) {
	synchronized (list) {
		//空间不足的情况
		while(num>MAX_SIZE-list.size()) {	
			System.out.print(Thread.currentThread().getName()+"库存空间不足,");
			int n1=MAX_SIZE-list.size();
			System.out.print("优先生产"+n1+"个商品");
			for(int i=1;i<=n1;i++) {
				list.add("obj");
			}
			num=num-n1;
			System.out.println("还有"+num+"个商品未生产!");
			
			try {
				list.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		list.notifyAll();
		for(int i=1;i<=num;i++) {
			list.add("obj");
		}
		System.out.println(Thread.currentThread().getName()+"已生产"+num+"个商品");
	}
}

public void customer(int num) {
	synchronized (list) {
		//库存不足的情况
		list.notifyAll();
		while(num>list.size()) {	
			System.out.print(Thread.currentThread().getName()+"库存不足,");
			int n1=list.size();
			System.out.print("优先消费"+n1+"个商品");
			for(int i=1;i<=n1;i++) {
				list.remove(0);
			}
			num=num-n1;
			System.out.println("还有"+num+"个商品未消费!");
			try {
				list.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		list.notifyAll();
		for(int i=1;i<=num;i++) {
			list.remove(0);
		}
		System.out.println(Thread.currentThread().getName()+"已消费"+num+"个商品");
	}
}

}

生产者

package thread;

public class Producer implements Runnable{

private Stroage stroge;
private int num;
public Producer(Stroage stroge,int num) {
	this.stroge=stroge;
	this.num=num;
}
@Override
public void run() {
	stroge.produceor(num);
}

}

消费者

package thread;

public class Customer implements Runnable {
private Stroage stroage;
private int num;
public Customer(Stroage stroage,int num) {
this.stroage=stroage;
this.num=num;
}
@Override
public void run() {
stroage.customer(num);
}
}

测试实现

package thread;

public class Demo1 {
public static void main(String[] args) {
Stroage stroage=new Stroage();
Producer p1=new Producer(stroage,90);
Producer p2=new Producer(stroage,120);
Producer p3=new Producer(stroage,100);
Producer p4=new Producer(stroage,60);
Thread t1=new Thread(p1,“yihao”);
Thread t2=new Thread(p2,“erhao”);
Thread t3=new Thread(p3,“sanhao”);
Thread t4=new Thread(p4,“sihao”);
t1.start();t2.start();t3.start();t4.start();

	Customer c1=new Customer(stroage, 120);
	Customer c2=new Customer(stroage, 80);
	Customer c3=new Customer(stroage,70);
	Customer c4=new Customer(stroage, 100);
	Thread t11=new Thread(c1,"wuhao");
	Thread t22=new Thread(c2,"liuhao");
	Thread t33=new Thread(c3,"qinhao");
	Thread t44=new Thread(c4,"bahao");
	t11.start();t22.start();t33.start();t44.start();
}

}
.

运行结果(线程随机生成结果)

yihao已生产90个商品
sihao已生产60个商品
sanhao库存空间不足,优先生产50个商品还有50个商品未生产!
erhao库存空间不足,优先生产0个商品还有120个商品未生产!
qinhao已消费70个商品
liuhao已消费80个商品
wuhao库存不足,优先消费50个商品还有70个商品未消费!
bahao库存不足,优先消费0个商品还有100个商品未消费!
erhao已生产120个商品
sanhao已生产50个商品
bahao已消费100个商品
wuhao已消费70个商品

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值