/**
*借助缓冲区
**/
public class CoTest01 {
public static void main(String[] args) {
SynContainter synContainter = new SynContainter();
new Productor(synContainter).start();
new Consumer(synContainter).start();
}
}
//消费者
class Consumer extends Thread{
private SynContainter containter;
Consumer(SynContainter containter) {
this.containter = containter;
}
//消费
@Override
public void run() {
for(int i = 0; i < 1000; i++){
System.out.println("消费-->" + containter.pop().id + "商品");
}
}
}
//生产者
class Productor extends Thread{
private SynContainter containter;
Productor(SynContainter containter) {
this.containter = containter;
}
// 生产
@Override
public void run() {
for(int i = 0; i < 10; i++){
System.out.println("生产-->" + i + "商品");
containter.push(new Steamedbun(String.valueOf(i)));
}
}
}
//缓冲区
class SynContainter{
Steamedbun[] buns = new Steamedbun[10];
int count = 0;
//存储数据
public synchronized void push(Steamedbun bun) {
//何时生产 容器存在空间
//不能生产
if (count == buns.length) {
try{
this.wait(); //线程阻塞 需要消费者者通知运行 wait阻塞时,锁是打开的
}catch (InterruptedException e){
e.printStackTrace();
}
}
buns[count] = bun;
count++;
this.notifyAll();//通知消费者消费
}
//弹出数据
public synchronized Steamedbun pop() {
//何时弹出数据 容器中是否存在数据
//没有数据时,等待
//存在数据时弹出
if(count == 0){
try {
this.wait();//线程阻塞 需要生产者通知运行,wait()阻塞时,锁是打开的
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--;
Steamedbun bun = buns[count];
this.notifyAll();//通知生产者生产
return bun;
}
}
//产品
class Steamedbun{
public String id;
Steamedbun(String id) {
this.id = id;
}
}
运行结果
生产-->0商品
生产-->1商品
生产-->2商品
生产-->3商品
生产-->4商品
生产-->5商品
生产-->6商品
生产-->7商品
生产-->8商品
生产-->9商品
消费-->0商品
消费-->9商品
消费-->8商品
消费-->7商品
消费-->6商品
消费-->5商品
消费-->4商品
消费-->3商品
消费-->2商品
消费-->1商品