生产者与消费者模式
1、主要思想:使用数组是实现缓存机制,当数组满时线程A(生产者)释放锁,并通知另一个线程B(消费者)拿锁操作资源,当消费者操作了资源就释放锁并通知生产者拿锁,操作资源
这里使用了管程法
//生产者和消费者模式:管程法
//生产者——>生产鸡
//消费者——>消费鸡
public class ProducerAndConsumer {
public static void main(String[] args) {
Buffer buffer = new Buffer();
new Producer(buffer).start();
new Consumer(buffer).start();
}
}
//生产者
class Producer extends Thread{
private final Buffer buffer;
public Producer(Buffer buffer) {
this.buffer=buffer;
}
//生产
@Override
public void run() {
for (int i = 0; i < 100; i++) {
synchronized (buffer){
buffer.push(new Chicken(i));
System.out.println("生产的第"+i+"只鸡");
}
}
}
}
//消费者
class Consumer extends Thread{
private final Buffer buffer;
public Consumer(Buffer buffer) {
this.buffer=buffer;
}
//消费
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("消费了第"+buffer.get().getId()+"只鸡");
}
}
}
//缓冲区
class Buffer{
//缓冲区大小 建立一个可以存放10个<鸡对象>的数组
private final Chicken[] chickens=new Chicken[10];
//缓冲区计数器
private int count=0;
//生产者 放入产品
synchronized public void push(Chicken chicken){
//如果容器满了, 生产者停止生产wait(), 通知消费者消费notify()
if(count==chickens.length){
try {
this.wait();//生产者停止生产
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果容器没满,生产者生产产品
chickens[count]=chicken;
count++;
this.notifyAll();//通知消费者消费
}
//消费者 拿产品
synchronized public Chicken get(){
//如果容器里没有产品,就等待
if(count<=0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果有产品,就消费
count--;
Chicken chicken = chickens[count];
//吃完了鸡,就叫生产者生产
this.notifyAll();
return chicken;
}
}
//产品 鸡
class Chicken{
//鸡的编号
private int id;
public Chicken(int id) {
this.id = id;
}
public int getId() {
return id;
}
}
红绿灯法
package com.yiheng.producerAndConsumer01;
//生产者-消费者模式:红绿灯法
//生产者——>生产鸡
//消费者——>消费鸡
public class ProducerAndConsumer01 {
public static void main(String[] args) {
Chicken chicken = new Chicken(0);
Producer producer = new Producer(chicken);
Consumer consumer = new Consumer(chicken);
new Thread(producer).start();
new Thread(consumer).start();
}
}
//生产者
class Producer implements Runnable{
Chicken chicken;
public Producer(Chicken chicken) {
this.chicken = chicken;
}
//生产
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
chicken.produce(i);
}
}
}
//消费者
class Consumer implements Runnable{
Chicken chicken;
public Consumer(Chicken chicken) {
this.chicken = chicken;
}
//消费
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
chicken.consume();
}
}
}
//产品 鸡
class Chicken{
//鸡的编号
private int id;
//立灯
private boolean flag=true;
public Chicken(int id) {
this.id = id;
}
public int getId() {
return id;
}
//生产
public synchronized void produce(int i){
//如果灯为false,停止生产
if (!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果灯为true,开始生产
System.out.println("生产了第"+i+"只鸡");
this.id=i;//给生产的鸡赋予编号;
this.flag=!this.flag;//让灯变为假
this.notifyAll();//通知消费者开始消费
}
//消费
public synchronized void consume(){
//如果灯为真,停止消费
if(flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//如果灯为假,开始消费
System.out.println("消费了的鸡的编号为:"+this.id);
this.flag=!this.flag;//让灯变为真
this.notifyAll();//通知生产者生产
}
}```