产品
class Chicken{
int id;
public Chicken(int id) {
this.id = id;
}
}
缓冲区(装产品)
class Container{
//定义装鸡的篮子大小
Chicken[] chickens =new Chicken[10];
int count=0;
//生产者生产鸡
public synchronized void push(Chicken chicken){
//如果篮子满了,则生产者停止生产
//如果篮子没满,生产鸡
//通知消费者可以开始消费了
}
//消费者消费鸡
public synchronized Chicken pop(){
//如果篮子中没有鸡,则消费者停止消费
//如果篮子中有鸡,消费鸡
//通知生产者开始生产
}
生产方法 push()
public synchronized void push(Chicken chicken){
//如果篮子满了,则生产者停止生产
if (count==chickens.length){
try {
this.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//如果篮子没满,生产鸡
chickens[count]=chicken;
count++;
//通知消费者可以开始消费了
this.notifyAll();
}
消费方法 pop()
public synchronized Chicken pop(){
//如果篮子中没有鸡,则消费者停止消费
if (count==0){
try {
this.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//如果篮子中有鸡,消费鸡
count--;
Chicken chicken =chickens[count];
//一定要先count--,因为生产者先把chicken放到chickens[count]里,再count++,所以count--才能得到放入的chicken
//通知生产者开始生产
this.notifyAll();
return chicken;
}
生产者
class Productor extends Thread{
Container container;
public Productor(Container container){
this.container=container;
}
@Override
public void run() {
for (int i = 0; i <30 ; i++) {
container.push(new Chicken(i));
System.out.println("生产共"+i+"只鸡");
}
}
}
消费者
class Consumer extends Thread{
Container container;
public Consumer(Container container){
this.container=container;
}
@Override
public void run() {
for (int i = 0; i <30 ; i++) {
// Chicken chicken = container.pop();
// 这么写中间操作系统可能进行线程的上下文切换,导致显示未生产先消费
// System.out.println("消费了第" + chicken.id + "只鸡");
System.out.println("消费了第" + container.pop().id+ "只鸡");
}
}
}
main方法
public class TestPC {
public static void main(String[] args) {
Container container = new Container();
Productor productor = new Productor(container);
Consumer consumer = new Consumer(container);
productor.start();
consumer.start();
}
}
标签:count,container,chicken,线程,Container,java,Chicken,多线程,public
From: https://www.cnblogs.com/linstudynotes/p/16864718.html