Thread的生产者和消费者模式

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

        一,介绍

                            生产者消费者模式,其实也是一种线程同步的机制,是利用线程间互斥的规则来达到,线程同步的,下面画个图来解释下这种机制
      


                            如下图:

                                 
                                   
                         解释一下:当生产者产生一个对象时,生产者就会等待,这个线程就会进入等待状态,然后唤醒消费者,消费者这个线程运行,消费者消费完成后,消费者这个
进程进入等待状态,这时生产者这个进程会被唤醒,生产者再次运行,这样周而复始,交替执行,下面看下一个Demo的代码

        二,Demo案例

                            1.Move.java(相当于生产者生产的对象和消费者消费的对象,即两个线程共享的对象)

    
                              
package com.geminno.thread;

public class Movie {
	private String pic;
	private boolean flag = true;
	
	public Movie(String pic) {
		super();
		this.pic = pic;
	}
	
	public Movie() {
		super();
		// TODO Auto-generated constructor stub
	}

	public synchronized void play(String pic){
		if(!flag){ // 如果flag 是false,停下不生产
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		// 开始生产
		/*try {
			Thread.sleep(300);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		System.out.println("我播放了电影=====>"+pic);
		this.pic = pic;
		
		//生产结束 ,叫醒消费者
		this.notify();
		//改变信号灯
		this.flag = false;
	}
	
	
	public synchronized void watch(){
		if(flag){//如果flag是true ,停止观看
			
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//开始观看
		/*try {
			Thread.sleep(200);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}*/
		System.out.println("我看了 --》"+pic);
		
		//看完之后.叫醒生产者,开始生产
		this.notifyAll();
		
		//改变信号灯
		this.flag = true;
		
	}
	
}


                       2.生产者线程对象(Player.java)

                  
package com.geminno.thread;

public class Player implements Runnable {
	Movie  m ;
	
	public Player(Movie m) {
		super();
		this.m = m;
	}

	@Override
	public void run() {
		
		for (int i = 0; i < 20; i++) {
			
			if(i % 2 == 0){
				m.play("倚天屠龙记");
			}else {
				m.play("简爱");
			}
		}
		
	}

}

         3.消费者线程(watcher.java)

     
package com.geminno.thread;

public class Watcher  implements Runnable{
	Movie m ;
	
	public Watcher(Movie m) {
		super();
		this.m = m;
	}

	@Override
	public void run() {
		for(int i=0;i<20;i++){
			
			
			m.watch();
		}
	}

}


                  4.测试程序(App.java)

      
package com.geminno.thread;

public class App {
	public static void main(String[] args) {
		Movie m = new Movie();
		
		Player player = new Player(m);
		new Thread(player).start();
		
		Watcher watcher = new Watcher(m);
		new Thread(watcher).start();
		
	}
}


                   5.打印结果

              
       
                    我们两个进程是交替执行,这样解决了线程不同步的问题了。另外,java1.5以后提供了新的等待唤醒机制,即Condition接口,使用方法是await()和signal方法
对应于wait和notify()方法。


C++ Boost.Thread模块实现生产者消费者模式 生产者消费者模式是多线程编程中常用的一种模式,其中生产者线程生成数据,消费者线程消费数据。在C++中,Boost库提供了一个有用的模块,即Boost.Thread,用于实现线程相关的操作。如果缓冲区为空,消费者线程将等待,直到生产者生成数据(即缓冲区非空)。如果缓冲区已满,生产者线程将等待,直到有消费者消费数据(即缓冲区不满)。,我们可以实现线程之间的同步通信,确保生产者消费者线程按照预期的方式工作。函数中,我们创建了一个生产者线程一个消费者线程,并使用。作为生产者消费者之间的共享缓冲区。 阅读详情

相关推荐

AJ-Report开源数据大屏存在远程命令执行漏洞

该平台可以通过post方式在validationRules参数对应值中进行命令执行,可以获得服务器权限,登陆管理后台接管大屏。如果被攻击者利用,危害后果十分严重。

swordheart的博客 352

【多线程篇】【thread】【生产者消费者模型】

生产者消费者之间不直接进行交互,而是通过一个缓冲区进行交互,生产者生产数据,然后存入缓冲区,消费者负责从缓冲区取出数据并消费数据。

handsomethefirst的博客 1407

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

蚂蚁小兵 2379

Thread线程中的生产者/消费者模型

一直对线程相关知识熟练使用但又感觉不是精深,现抽时间通过对线程的原理、基本使用、线程状态、线程中断、线程安全、线程池的详细梳理,整理成线程的系列博客文章,搭建成自己的一个线程知识体系,帮助自己更加全面深刻的认知理解线程,希望对各位看官也能有帮助。

luo_boke的博客 416

java Thread 生产者消费者模式

java 学习笔记Thread 生产者消费者模式

qq_54302958的博客 313

Std::Thread 实现最简单的生产者消费者模型

C++11 std::thread 实现经典的生产者消费者模型

maybcsdn的博客 749

JAVA多线程之生产者消费者模型

生产者消费者模型 所谓的生产者消费者模型,是通过一个容器来解决生产者消费者的强耦合问题。通俗的讲,就是生产者在不断的生产消费者也在不断的消费,可是消费者消费的产品是生产者生产的,这就必然存在一个中间容器,我们可以把这个容器想象成是一个货架,当货架空的时候,生产者生产产品,此时消费者在等待生产者往货架上生产产品,而当货架满的时候,消费者可以从货架上拿走商品,生产者此时等待货架的空位,这样不断...

L_R 2万+

Thread-Per-Message 模式、Worker Thread 模式生产者-消费者模式

模式分工机制优点缺点适用场景每请求一个线程简洁、无共享高并发下资源耗尽简单 socket 服务固定线程 + 任务分配线程重用、高效调度逻辑稍复杂Web 服务/任务队列队列缓冲 + 解耦异步解耦、限流控制复杂度高日志处理、流水线任务。

怪味Coding 434

C++多线程推理、生产者消费者模式封装

C++多线程推理、生产者消费者模式封装

weixin_44966641的博客 2698

多线程python 客户端fuwuq实现方式_四、Python多线程实现生产者消费者模式

什么是生产者消费者模式在软件开发的过程中,经常碰到这样的场景:某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数、线程、进程等)。产生数据的模块称为生产者,而处理数据的模块称为消费者。在生产者消费者之间的缓冲区称之为仓库。生产者负责往仓库运输商品,而消费者负责从仓库里取出商品,这就构成了生产者消费者模式。结构图如下:为了大家容易理解,我们举一个寄信的例子。假设你要寄一封信...

weixin_39530269的博客 59

Java丨生产者消费者模式 经典面试题

继续昨天遗留的问题: 1、生产者消费者模型的作用是什么2、sleep方 法wait方法有什么区别 3、如何在两个线程之间共享数据 4、为什么wait()方法notify()/notifyAl()方法要在同步块中被调用 5、wait()方法notify()/notifAIl()方法在放弃对象监视器时有什么区别. 6、Thread.sleep(0)的作用是什么 生产者消费者模型的作用...

weixin_45290108的博客 1345

并发设计模式(三)重要

三种最简单的分工模式 并发编程领域里,解决分工问题也有一系列的设计模式,比较常用的主要有 Thread-Per-Message 模式、Worker Thread 模式生产者 - 消费者模式等等。 Thread-Per-Message 模式 在编程领域也有很多类似的需求,比如写一个 HTTP Server,很显然只能在主线程中接收请求,而不能处理 HTTP 请求,因为如果在主线程中处理 HTTP 请求的话,那同一时间只能处理一个请求,太慢了!怎么办呢?可以利用代办的思路,创建一个子线程,委托子线程去处理 H

pngyul的博客 396

【多线程篇】sleepwait的区别?notifynotify的作用?如何实现生产者-消费者模式

目录sleepwait的区别?1. sleep方法(休眠)1. 源码分析2. 作用3. 题外话:sleep之后线程会释放锁吗4. sleep的使用场景2. wait方法(等待)1. 源码分析1. 作用2. 使用场景3. notify1. notify的作用2. 为什么要使用notifynotifyAll?3. 应用场景4. 如何使用waitnotifyAll实现生产者-消费者模式1. 注意事项1. 题外话:为什么waitnotify方法要在synchronized方法里使用?2. 实现1. 生产者1

weixin_45325628的博客 2912

python使用pulsar-thread生产消费

文章目录前言一、pulsar-thread是什么?二、安装pulsar-thread三、使用说明1. 连接 (client)2. 生产者(producer)3. 消费者(consumer)四、当使用 pulsar-client(pulsar.Client)连接时1. 生产者(producer)2. 消费者(consumer)四、关于schema模式1. schema支持的模式2. schema参数用法pulsar-client相同 前言 pulsar是一个云原生的分布式消息流平台。 本文主要介绍使用pu

美味大香蕉的博客 3395

c++ 简单的生产者消费者模式

生产者消费者模型并不属于面向对象的23中设计模式之一,实际上是结构化编程思想中的一种经典模式,使用非常广泛。而在面向对象编程过程中也不会只是面向对象,通常是与结构化编程相辅相成的。好了闲话不多说,下面的例子非常简单的使用了std::thread来实现一个生产者消费者模型。 #include <iostream> #include <thread> #include <chrono> #include <queue> #include &lt...

yuanshenqiang的博客 1276

使用多线程的多消费者生产者模式

C++11的多线程一下子是C++的再多线程方面迈出了一大步,再也不用依赖第三方库了。 我感觉多线程的要点是在修改共享变量的时候,要加锁。修改完再释放锁。 std::thread可以建立一个线程。 std::mutex 定义一个锁。 std::condition_variable 定义一个条件变量。使用的时候,结合mutex的锁机制一块使用。条件变量,它的条件必须满足已被当前线程锁定的前提。有wa...

weixin_41157881的博客 560

【无标题】std::thread

把代码写在一个cpp文件里面。

积累与备忘 139

Worker-Thread设计模式

线程池在某种意义上也算是Worker-Thread模式的一种实现,线程池初始化时创建线程类似于在流水线等待工作的工人,提交给线程池的Runnable接口类似于需要加工的产品,Runnable的run方法相当于组装该产品的说明书。Worker-Thread模式生产线保存了在处理中的产品,并且是启动生产线的线程后,生产线启动若干数量的流水线工人线程 ,生产线聚合了产品工人。生产者消费者模式是单纯的依赖关系,生产者消费者都依赖产品队列,生产者消费者是相互不知道。流水线工人:对传送带上的产品进行加工。

seacean2000的专栏 368

Thread 线程协作-Object对象的waitnotifynotifyAll方法原理,通过notifyAllwait方法完成生产者消费者模型案例

线程协作 所谓线程协作也就是多线程并发编程中,线程与线程之间完成同一个业务逻辑,期间可能有线程等待、线程通知。 线程等待实现方式 Thread线程类的sleep方法,等待指定时间后自动唤醒线程。Object类的wait 方法,线程睡眠后只能通过Object的notifynotifyAll唤醒线程。 notify 方法随机唤醒多个等待线程中的一个,而notifyAll方法则唤醒所有等待线程。 ...

红鹰 423

java 生产者消费者_初级面试:面试官让我手写生产者消费者模式代码

java中能实现生产者消费者的方式有好几种,在初级面试中,大多数都是使用java中的wait() / notify()方法来实现的。实现思路:当缓冲区已满时,生产者线程停止执行,放弃锁,使自己处于等状态,让其他线程执行;当缓冲区已空时,消费者线程停止执行,放弃锁,使自己处于等状态,让其他线程执行。当生产者向缓冲区放入一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态;当...

weixin_39959192的博客 114
上一篇: 单例模式介绍
下一篇: 关于子类继承父类属性的问题讨论(希望得到大神指点)
K_122
博客等级 码龄11年 11粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值