@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个商品