注意:这里利用了一个缓冲区 来解决消费者没有东西消费的问题,生产者生产产品往缓冲区放,
当缓冲区没有产品时,消费者等待,唤醒 生产者生产,生产者生产产品后等待,唤醒消费者消费
注释写的很详细。
package com.yyf.Gaoji;
public class TestProducerConsumer {
public static void main(String[] args) {
SynContainer container = new SynContainer ();
new Producer (container).start ();
new Consumer (container).start ();
}
}
class Producer extends Thread{
SynContainer container;
public Producer(SynContainer container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println ("生产者生产了"+i+"只鸡");
container.push (new Chicken (i));
}
}
}
class Consumer extends Thread{
SynContainer container;
public Consumer(SynContainer container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println ("消费者消费了"+container.pop ().id+"只鸡");
}
}
}
// 产品 鸡
class Chicken{
// 鸡的编号
int id;
public Chicken(int id) {
this.id = id;
}
}
// 缓冲区 消费者消费生产的鸡
class SynContainer extends Thread{
// 设置缓冲区大小 缓冲区可以存放十只鸡
Chicken[] chickens= new Chicken[10];
// 来个 容器计数器
int count=0;
// 生产者放入产品
public synchronized void push(Chicken chicken){
// 如果 缓冲的鸡满了 就需要等待消费者消费
if (count==chickens.length){
// 通知消费者消费 生产者等待
try {
this.wait ();
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
// 如果没有满, 我们就需要丢入产品
chickens[count]=chicken;
count++;
// 然后通知消费者消费
this.notifyAll ();
}
// 消费者消费产品
public synchronized Chicken pop(){
if (count==0){
try {
this.wait ();
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
// 如果缓冲区有鸡 则消费
count--;
Chicken chicken= chickens[count];
// 如果缓冲区 吃完了 通知生产者 生产
this.notifyAll ();
return chicken;
}
}