首页 > 编程语言 >java多线程生产者消费者线程并发协作测试心得

java多线程生产者消费者线程并发协作测试心得

时间:2022-11-07 00:33:27浏览次数:41  
标签:count container chicken 线程 Container java Chicken 多线程 public

图11-17 生产者消费者示意图

产品

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

相关文章

  • 3184-2020-Java-国赛-4-2
    这个题有点意思,是解一个二元一次方程,手算很简单,但是怎么用算法来解还真没想过,一下子好像也没什么思路importjava.util.*;importjava.io.*;classMain{publics......
  • 多线程
    JUC并发编程多线程三种创建方式继承Thread(Thread实现了Runnable接口)实现Runnable(这种方式需要将该实现类作为参数调用Thread对象)实现Callable线程的状态线程方法......
  • java8将日期格式yyyyMM转换为LocalDate
    LocalDate:parseyyyy-MM当我们希望将一个yyyyMM格式的日期转换为LocalDate的时候,不出意外会报错java.time.format.DateTimeParseException因为LocalDate是需要指定到具......
  • Java IO流
    1、创建文件对象相关构造器和方法newFile(Stringpathname)//根据路径构建一个File对象newFile(Fileparent,Stringchild)//根据父目录文件+子路径构建newFile(Strin......
  • javaSE基础-异常
    异常(Exception)异常相关概念异常:是在运行时期发生的不正常情况。运行时异常:可以正常编译,只有在代码运行的过程中,由于参数运算的数据导致异常。编译时异常:编译检查时......
  • java--Stream流基础
    Stream流操作方法执行完此方法之后,Stream流依然可以继续执行其他操作Stream流的思想 Stream流的三类方法  获取Stream流    好比创建一条流水线,并把数据放......
  • java 集合
    packagecom.tedu.day1302;importjava.util.ArrayList;importjava.util.Collection;publicclassStudy_Collection{publicstaticvoidmain(String[]args)......
  • Java io流
    文件1、什么是文件?文件是我们保存数据的地方。2、文件流文件在程序中是以流的形式来操作的。流:数据在数据源(文件)和程序(内存)之间经历的路径输入流:数据从数据源(文件)到程序......
  • 简述Java对文件相关操作
    一、创建文件publicvoidcreate1(){StringfilePath="D:\\file1.txt";Filefile=newFile(filePath);try{file.createNewFile();Syste......
  • javaIO流实验1-8小题
    1.IO流,什么是IO?I:InputO:Output通过IO可以完成硬盘文件的读和写。2.IO流的分类?有多种分类方式:1)一种方式是按照流的方向进行分类:以内存作为参照物,往内存中去,叫做输......