首页 > 其他分享 >多线程--消费者与生产者实例

多线程--消费者与生产者实例

时间:2023-01-31 21:22:30浏览次数:45  
标签:count -- id 实例 cushion 缓冲区 Chicken 多线程 public

多线程实例

1.消费者与生产者实例(管程法)

  • 产品、消费者、生产者、缓冲区
    • 产品,保证有一个唯一标识即可
    • 消费者继承Thread,注册缓冲区,从缓冲区消费
    • 生产者继承Thread,注册缓冲区,向缓冲区生产
    • 缓冲区确定容器大小,包含消费方法pop()、生产方法push()。处理线程问题
package com.wzh.thread;

/**
 * @author 75654
 *
 * 管程法:
 *      生产者,消费者,缓冲区
 *      生产者将生产物品放入缓冲区,消费者从缓冲区获取物品。
 *
 * 例:生产者生产鸡肉,消费消费鸡肉
 *      使用wait()、notifyAll()
 */
public class gcThread {
    public static void main(String[] args) {
        Cushion cushion = new Cushion();
        new Producer(cushion).start();
        new Consumer(cushion).start();
    }

}

/**
 * 产品--鸡肉 id
 */
class Chicken{
    private int id;

    public Chicken(){
    }

    public Chicken(int id){
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

/**
 * 生产者--生产鸡肉
 */
class Producer extends Thread{
    private Cushion cushion;

    public Producer(Cushion cushion) {
        this.cushion = cushion;
    }

    /**
     * 生产
     *      注意输出语句放在操作前面,避免输出紊乱
     */
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("生产鸡,编号" + i + "Id");
            cushion.push(new Chicken(i));
        }
    }
}

/**
 * 消费者--消费鸡肉
 */
class Consumer extends Thread {
    private Cushion cushion;

    public Consumer(Cushion cushion) {
        this.cushion = cushion;
    }

    /**
     * 消费
     */
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("吃了鸡编号:" + cushion.pop().getId());
        }
    }
}

/**
 * 缓冲区--存放鸡肉
 *      取出
 *      存放
 */
class Cushion{
    /**
     * 缓冲区大小,鸡肉存放位置标记
     */
    private Chicken[] chickens = new Chicken[10];
    private int count = 0;

    /**
     * 存入
     * @param chicken
     */
    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;
    }

}

标签:count,--,id,实例,cushion,缓冲区,Chicken,多线程,public
From: https://www.cnblogs.com/mengdreams/p/17080800.html

相关文章

  • 「☆□□」「能刺穿切開貶低制裁任何人的極惡而全能的神明大人」站在垃圾桶上等候真命天子。花一样抛洒的白色粉末,羽毛般洁白地融化在脑中。啊啊,错乱的闪白,遮盖视野的......
  • gitHub 提交代码
    1.首先在gitHub创建账号,然后创建一个仓库 2.push代码,提交代码时,URL填gitHub上的HTTPS的url    点击ok,会出现让登陆gitHub,可以填token登陆,登陆从gitHub上的se......
  • 2023第一个月总结
    对现有工作的不满意,发现身边人逐渐被生活改变,成为生活的累赘。工作的螺丝钉,机械且重复的活着,毫无新意。那我呢?对较好收入的屈服?不,我不想被生活摒弃,成为一颗螺丝钉。但我......
  • mac下载App报错
    mac下载App报错:该文件打不开,或者文件被破坏。一、解决方法:在“终端”输入:sudoxattr-dcom.apple.quarantine+(XXX.app)(XXX.app)是你在xxx.app在电脑的路......
  • E 清楚姐姐打怪升级【2023牛客寒假算法基础集训营4】
    E 清楚姐姐打怪升级原题链接代码点击查看代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#incl......
  • Docker部署Nacos自动停止运行
    1、现象使用docker部署的Nacos在运行一段时间后,就自动停止运行了。查看docker运行容器,nacos停止了2、解决因为是学生购买的轻量级服务器,所以配置很低,出现这种问题我默......
  • BZOJ 1852 [MexicoOI06] 最长不下降序列
    https://darkbzoj.cc/problem/1852首先解决初始排序的问题:先把\(i,j\)对应的两组数\((a_i,b_i),(a_j,b_j)\)分为“必要”,“非必要”两类。“必要”,指\(i\)必须......
  • 代码随想录(2)-链表
    题单203.移除链表元素链表节点对象publicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)......
  • 类加载过程
    类加载过程当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、连接、初始化三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时......
  • DOM的通用属性和class属性操作
    DOM的通用属性attr():获取/设置元素的属性removeAttr():删除属性prop():获取/设置元素的属性removeProp():删除属性attr和prop区别:1、如果操作的是元素的固有属性,则......