多线程基础3:管程法实现并发协作(生产者消费者)

解析

  1. 整个线程运行过程中,经历初始、阻塞、运行、结束等状态,不同操作下相互转换状态(除结束状态不能转为其他状态),如下图所示。


    在这里插入图片描述

    2.并发协作,实际上也就是常说的生产者消费者了,在它们之间存在一个缓存队列,作为消费和生产的空间。其次有以下重点
    a.生产者在缓存队列满时不再生产
    b.消费者在缓存队列为null时不再消费
    c.当生产者生产可消费的资源时通知消费者消费
    d.当消费者没有资源时通知等待生产者生产

源码实现

package thread3;
/*
* 协作模式:生产者消费者实现方式一:管程法
* */
public class CoTest {
    public static void main(String[] args) {
        //创建缓存队列
        SynContainer synContainer=new SynContainer();
        //生产者生产
        new Productor(synContainer).start();
        //消费者消费
        new Consumer(synContainer).start();
    }
}
//生产者
class Productor extends Thread{
    SynContainer synContainer;
    //计算器
    int count=0;
    public Productor(SynContainer synContainer){
        this.synContainer=synContainer;
    }
    public  void run(){
        //生产者生产苹果
        for (int i = 1; i < 100; i++) {
            count++;
            Apple apple = new Apple(i);
            synContainer.push(apple);
            System.out.println("生产第" + i + "个苹果");
        }

    }
}
//消费者
class Consumer extends Thread{
    SynContainer synContainer;
    //计算器
    int count=10;
    public Consumer(SynContainer synContainer){
        this.synContainer=synContainer;
    }
    public  void run(){
        //消费者消费苹果
        for (int i = 1; i < 100; i++) {
            System.out.println("消费第" + synContainer.poop().id + "个苹果");
            count--;
        }
    }
}
//缓冲区
class SynContainer{
    //资源数组(缓冲队列)
    Apple[] apples=new Apple[100];
    int count=0;
    //生产相当于往容器里加值
    public synchronized void push(Apple apple){
        if(count==10){
            try {
                //当容器值满等待停止生产
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        apples[count]=apple;
        count++;
        //当生产时通知消费者消费用all直接通知所有
        this.notifyAll();
    }
    //消费往容器中减值
    public synchronized Apple poop(){
        if(count==0){
            try {
                //当容器无值停止消费。等待通知
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count--;
        //当消费时通知生产者生产,用all直接通知所有
        this.notifyAll();
        Apple a = apples[count];
        return a;
    }
}
//apple资源
class Apple{
  int id;
  public Apple(int id){
      this.id=id;
  }
}

运行结果:
生产第1个苹果
生产第2个苹果
生产第3个苹果
生产第4个苹果
生产第5个苹果
生产第6个苹果
生产第7个苹果
生产第8个苹果
生产第9个苹果
生产第10个苹果
生产第11个苹果
消费第10个苹果
消费第11个苹果
消费第9个苹果
消费第8个苹果
消费第7个苹果
消费第6个苹果
消费第5个苹果
消费第4个苹果
消费第3个苹果
消费第2个苹果
消费第1个苹果
生产第12个苹果
生产第13个苹果
生产第14个苹果
生产第15个苹果
生产第16个苹果
生产第17个苹果
生产第18个苹果
生产第19个苹果
生产第20个苹果
生产第21个苹果
消费第21个苹果
消费第20个苹果
消费第19个苹果
消费第18个苹果
消费第17个苹果
消费第16个苹果
消费第15个苹果
消费第14个苹果
消费第13个苹果
消费第12个苹果
生产第22个苹果
生产第23个苹果
生产第24个苹果
生产第25个苹果
生产第26个苹果
生产第27个苹果
生产第28个苹果
生产第29个苹果
生产第30个苹果
生产第31个苹果
消费第31个苹果
消费第30个苹果
消费第29个苹果
消费第28个苹果
消费第27个苹果
消费第26个苹果
消费第25个苹果
消费第24个苹果
消费第23个苹果
消费第22个苹果
生产第32个苹果
生产第33个苹果
生产第34个苹果
生产第35个苹果
生产第36个苹果
生产第37个苹果
生产第38个苹果
生产第39个苹果
生产第40个苹果
生产第41个苹果
消费第41个苹果
消费第40个苹果
消费第39个苹果
消费第38个苹果
消费第37个苹果
消费第36个苹果
消费第35个苹果
消费第34个苹果
消费第33个苹果
消费第32个苹果
消费第42个苹果
生产第42个苹果
生产第43个苹果
消费第43个苹果
消费第44个苹果
生产第44个苹果
生产第45个苹果
生产第46个苹果
生产第47个苹果
生产第48个苹果
生产第49个苹果
生产第50个苹果
生产第51个苹果
生产第52个苹果
生产第53个苹果
生产第54个苹果
消费第54个苹果
生产第55个苹果
消费第55个苹果
消费第56个苹果
消费第53个苹果
消费第52个苹果
消费第51个苹果
消费第50个苹果
消费第49个苹果
消费第48个苹果
消费第47个苹果
消费第46个苹果
消费第45个苹果
生产第56个苹果
生产第57个苹果
生产第58个苹果
生产第59个苹果
生产第60个苹果
生产第61个苹果
生产第62个苹果
生产第63个苹果
生产第64个苹果
生产第65个苹果
生产第66个苹果
消费第66个苹果
消费第65个苹果
消费第64个苹果
消费第63个苹果
消费第62个苹果
消费第61个苹果
消费第60个苹果
消费第59个苹果
消费第58个苹果
消费第57个苹果
生产第67个苹果
生产第68个苹果
生产第69个苹果
生产第70个苹果
生产第71个苹果
生产第72个苹果
生产第73个苹果
生产第74个苹果
生产第75个苹果
生产第76个苹果
消费第76个苹果
消费第75个苹果
消费第74个苹果
消费第73个苹果
消费第72个苹果
消费第71个苹果
消费第70个苹果
消费第69个苹果
消费第68个苹果
消费第67个苹果
生产第77个苹果
生产第78个苹果
生产第79个苹果
生产第80个苹果
生产第81个苹果
生产第82个苹果
生产第83个苹果
生产第84个苹果
生产第85个苹果
生产第86个苹果
消费第86个苹果
消费第85个苹果
消费第84个苹果
消费第83个苹果
消费第87个苹果
生产第87个苹果
生产第88个苹果
生产第89个苹果
生产第90个苹果
生产第91个苹果
消费第82个苹果
生产第92个苹果
消费第92个苹果
生产第93个苹果
消费第93个苹果
消费第94个苹果
生产第94个苹果
消费第91个苹果
生产第95个苹果
生产第96个苹果
生产第97个苹果
消费第95个苹果
消费第97个苹果
消费第96个苹果
消费第90个苹果
消费第89个苹果
消费第88个苹果
消费第81个苹果
消费第80个苹果
消费第79个苹果
消费第78个苹果
消费第77个苹果
生产第98个苹果
生产第99个苹果
消费第99个苹果

你可能感兴趣的:(多线程基础3:管程法实现并发协作(生产者消费者))