模拟生产者消费者模型

简介: 生产者消费者是多线程很经典的一个模型牵涉三个对象:仓库、生产者、消费者

生产者消费者是多线程很经典的一个模型

牵涉三个对象:仓库、生产者、消费者

仓库代表共享变量

生产者表示在仓库生产货物

消费者表示从仓库拿出货物


实现思路:利用synchronized+wait()+notify()

对生产者消费者对应的操作用synchronized关键字保证线程安全,通过wait()和notify()实现生产者消费者的通讯


实现方式还有好几种,这里只例举一种,其他几种请参考java线程间通讯的几种方式


demo

public class Programmer {
    // bug数量,模拟仓库
    private int bug = 0;
    // 写bug,模拟生产者
    public synchronized void makingBug() throws InterruptedException {
        for (; ; ) {
            if (bug < 5) {
                System.out.println(Thread.currentThread().getName() + "写了一个bug,当前bug数:" + ++bug);
                //模拟写bug花费的时间
                Thread.sleep(100);
            } else {
                System.out.println("======bug太多被老板画了饼,开始修复bug======");
                notify();
                wait();
            }
        }
    }
    // 修bug,模拟消费者
    public synchronized void fixingBug() throws InterruptedException {
        for (; ; ) {
            if (bug > 0) {
                System.out.println(Thread.currentThread().getName() + "修复了一个bug,当前bug数:" + --bug);
                //模拟修复bug花费的时间
                Thread.sleep(100);
            } else {
                System.out.println("======bug修完了,继续摸鱼======");
                notify();
                wait();
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        // new一个苦逼程序员
        Programmer programmer = new Programmer();
        new Thread(() -> {
            try {
                programmer.makingBug();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "摸鱼模式的程序员").start();
        new Thread(() -> {
            try {
                programmer.fixingBug();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "刚被老板画饼的程序员").start();
    }
}

运行结果:

20210716171502754.png

相关文章
|
1月前
|
并行计算 Go 调度
Goroutine调度机制深度探究
【2月更文挑战第17天】Goroutine作为Go语言轻量级的并发执行体,其高效的调度机制是Go语言并发性能卓越的关键。本文将深入探究Goroutine的调度原理、调度器的实现以及调度过程中的优化策略,帮助读者全面了解Goroutine调度机制的内部工作机理,从而更好地利用Go语言的并发特性。
|
1月前
|
设计模式
LabVIEW建立生产者消费者
LabVIEW建立生产者消费者
21 3
|
1月前
|
数据采集 设计模式 缓存
LabVIEW生产者消费者架构
LabVIEW生产者消费者架构
30 2
|
1月前
用R语言模拟M / M / 1随机服务排队系统
用R语言模拟M / M / 1随机服务排队系统
|
1月前
线程同步之 生产者消费者模型详解
前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先为为数不多的朋友把生产者消费者模型讲一讲,希望大家能看懂(没有现成和锁知识的朋友不要急,这部分是写给有基础的朋友看的,这些知识博主都会慢慢的讲到)。 前言 博主本来没打算讲这个比较前面的知识的(博主socket编程还有两个部分没讲,进程也才写完回收僵尸进程的三种方法,信号捕捉器也才完结),但是今天有朋友来问博主,什么是生产者消费者模型,所以博主就先为为数不多的朋友把生产
30 0
|
1月前
|
SQL 供应链 安全
Linux多线程【生产者消费者模型】
Linux多线程【生产者消费者模型】
67 0
|
10月前
|
安全 Linux 数据安全/隐私保护
【Linux线程同步】生产者消费者模型
【Linux线程同步】生产者消费者模型
88 0
|
11月前
|
存储 数据处理 容器
生产者消费者模型(一)
生产者消费者模型
100 0
|
11月前
|
存储
生产者消费者模型(二)
生产者消费者模型
58 0
|
消息中间件 前端开发 Java
Actor 模型工作机制和消息机制 | 学习笔记
快速学习 Actor 模型工作机制和消息机制
438 0
Actor 模型工作机制和消息机制 | 学习笔记