java多线程实现生产者和消费者

史前最详细的:Java线程池核心流程解析 1. 前言 线程池是JAVA开发中最常使用的池化技术之一,可以减少线程资源的重复创建与销毁造成的开销。 2. 灵魂拷问:怎么做到线程重复利用? 很多同学会联想到连接池,理所当然的说:需要的时候从池中取出线程,执行完任务再放回去。 如何用代码实现呢? 此时就会发现,调用线程的start方法后,生命周期就不由父线程直接控制了。线程的run方法执行完成就销毁了,所谓的“取出”和“放回”只不过是想当然的操作。 这里先说答案:生产者消费者模型 3. ThreadPoolExecutor的实现 3.1 结构 首先看下 阅读详情

首先创建生产者和消费者工厂类

Object lock = new Object();
	boolean flag = false;
	int count = 0;
	/**
	 * 生产者
	 * @throws InterruptedException 
	 */
	public void product() throws InterruptedException{
		synchronized(lock){
			if(!flag){
				System.out.println("生产者生产的第"+count+"个");
				flag = true;
				lock.notify();
			} else {
				lock.wait();
			}
		}
	}
	
	/**
	 * 消费者
	 * @throws InterruptedException
	 */
	public void consume() throws InterruptedException{
		synchronized(lock){
			if(flag){
				System.out.println("消费者消费的第"+count+"个");
				count++;
				flag = false;
				lock.notify();
			} else {
				lock.wait();
			}
			
		}
	}

创建 生产者和消费者的多线程类

private ThreadFactory threadFactory;

	public ProductThread(ThreadFactory threadFactory) {
		super();
		this.threadFactory = threadFactory;
	}
	
	
	public void run(){
		try {
			while(true){
				threadFactory.product();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
private ThreadFactory threadFactory;

	public ConsumeThread(ThreadFactory threadFactory) {
		super();
		this.threadFactory = threadFactory;
	}

	public void run(){
		try {
			while(true){
				threadFactory.consume();
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

 测试类

public class Test {

	public static void main(String[] args) {
		ThreadFactory threadFactory = new ThreadFactory();
		
		ProductThread productThread = new ProductThread(threadFactory);
		productThread.start();
		
		ConsumeThread consumeThread = new ConsumeThread(threadFactory);
		consumeThread.start();
	}
	
}

控制台的打印结果,可以发现每当生产者生成一个消费者消费一个。

 如果有多个生产者和消费者呢?

改造代码

public static void main(String[] args) {
		ThreadFactory threadFactory = new ThreadFactory();
		
		ProductThread productThread = new ProductThread(threadFactory);
		productThread.start();
		
		ProductThread productThread1 = new ProductThread(threadFactory);
		productThread1.start();
		
		ConsumeThread consumeThread = new ConsumeThread(threadFactory);
		consumeThread.start();
		
		ConsumeThread consumeThread1 = new ConsumeThread(threadFactory);
		consumeThread1.start();
	}

打印结果

会发现生产者生产3后,线程没有执行了。这是为什么呢?看代码

 当生产者生产完3后,将flag置为true,然后notify(),此时会唤醒一个线程,所以就会出现一个生产者和两个消费者竞争.当生产者获取的CPU使用权后,会进入product方法,但是由于flag= true,则直接进入lock.wait();所以我们希望当唤醒线程时,只唤醒消费者的线程。

Condition关键字

condition的介绍这里就不解释了,网上相关的知识特别多。简而言之就是它可以特定的唤醒线程,而不是像notify一样全部唤醒

condition需要借助Lock来实现,它的await(),signal(),signalAll()相当于wait(),notify(),notifyAll()。

public class ThreadFactory {

	//Object lock = new Object();
	
	boolean flag = false;
	int count = 0;
	
	Lock lock = new ReentrantLock();
	
	Condition productCondition = lock.newCondition();
	
	Condition consumeCondition = lock.newCondition();
	/**
	 * 生产者
	 * @throws InterruptedException 
	 */
	public void product() throws InterruptedException{
		lock.lock();
		try {
			if(!flag){
				System.out.println("生产者生产的第"+count+"个");
				flag = true;
				consumeCondition.signal();
			} else {
				productCondition.await();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
		
	}
	
	/**
	 * 消费者
	 * @throws InterruptedException
	 */
	public void consume() throws InterruptedException{
		lock.lock();
		try {
			if(flag){
				System.out.println("消费者消费的第"+count+"个");
				count++;
				flag = false;
				productCondition.signal();
			} else {
				consumeCondition.await();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
}

这样一来,在生产者里面唤醒的是消费者,而在消费者里面唤醒生产者。

进程同步-生产者和消费者(PV操作实现——java多线程模拟) 进程同步-生产者和消费者(PV操作实现——java多线程模拟)目录进程同步-生产者和消费者PV操作实现java多线程模拟 目录 生产者和消费者概述 PV操作解决生产者和消费者 任务要求 程序代码 运行结果 生产者和消费者概述 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的 阅读详情

相关推荐

算法之动态规划(DP)求解完全背包问题

算法之动态规划(DP)求解01背包问题 上面这篇文章主要讲解了01背包问题和动态规划算法,如果你不了解动态规划算法,建议先浏览一下这篇文章熟悉一下,因为,本文的算法思想是基于这篇文章的。 1、什么是完全背包问题? **01背包问题:**有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品只能取1次放入背包中,背包所有物品权重和最大是多少? 完全背包: 有一个背包的容积为V,有N个物品,每个物品的体积为v[i],权重为w[i],每个物品可以取无限次放入背包中,背包所有物品权重和

PRML_MAN的博客 2万+

Java多线程实现生产者消费者问题

Java多线程实现生产者消费者问题 问题描述: 假设在汉堡店中,有最多能放10个汉堡的窗口,有生产汉堡的厨师,还有前来消费汉堡的消费者。厨师在窗口没摆满汉堡时一直生产汉堡放到窗口,消费者在窗口有汉堡时能进行消费。 模型抽象: 生产者(厨师):新加产品到缓冲池,当缓冲池产品达到最大值(满了)时进入wait状态。 消费者:提取缓冲池中的产品,当缓冲池产品为空时进入wait状态等待 缓冲池(窗口):存放...

qq_41257358的博客 1699

三甲医院网络架构与安全建设实战

华为OceanStor] [华为OceanStor][PACS存储双活] [HIS数据库同步]患者隐私 数据脱敏 天清Web防火墙动态脱敏策略。主数据中心 --[OTV专线]-- 备数据中心。实现医疗业务网/卫生专网/互联网三网隔离。核心业务配置(华为CE6865)自动备份配置(每天02:00)安全事件响应(30分钟SLA)漏洞扫描(每周日00:00)实现医疗物联网统一接入管控。五、等保2.0合规关键配置。堡垒机登录(双因素认证)四、医疗物联网安全方案。

有小小的远大抱负 1910

java启动新的线程_java – 使用spring从服务层启动新线程的正确方法

我有一个很少被调用的方法.此方法在db中收集垃圾.我不想让用户等待服务器响应,所以我决定从我的服务层的新线程调用此方法.我正在使用Spring.服务类:@Service@Transactionalpublic class UploadService {@Resource(name = "UploadDAO")private UploadDao uploadDao;我不想等待的方法public vo...

weixin_39526872的博客 503

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3134

Jupyter实战:解决ModuleNotFoundError之xgboost缺失问题

本文详细解析了在Jupyter Notebook中遇到ModuleNotFoundError: No module named 'xgboost'错误的完整解决方案。通过诊断环境、使用pip正确安装xgboost、配置Python路径以及最终验证,帮助用户彻底解决模块缺失问题,并理解Jupyter内核与Python环境的关系,提升问题排查能力。

weixin_29064103的博客 384

JAVA多线程中的消费者生产者

面试题如何控制线程的执行顺序,生产者消费者问题

maxker的博客 1707

双向晶闸管交流调压基础知识及Multisim电路仿真

本文介绍了双向晶闸管交流调压电路的工作原理及应用。该电路由双向晶闸管、RC移相电路和双向触发二极管组成,通过调节电位器改变触发角实现电压调节。当电位器阻值减小时,触发角减小,输出电压升高;阻值增大时,触发角增大,输出电压降低。Multisim仿真展示了不同电位器档位下的波形特征:0%档位时全导通,50%档位时半导通,100%档位时基本关断。该电路结构简单、调节平滑,广泛应用于调光、调速等场合,但会产生谐波干扰。

XU157303764的博客 837

java多线程并发 : 生产者-消费者模型的三种实现方式

生产者生产数据到缓冲区中,消费者从缓冲区中取数据。 如果缓冲区已经满了,则生产者线程阻塞; 如果缓冲区为空,那么消费者线程阻塞。 方式一:synchronized、wait和notify package day4; //wait 和 notify public class ProducerConsumerWithWaitNofity { public static void main(String[] args) { Resource resource = new Resource

火星男孩的分享空间 3160

【前端圭臬】二:你知道的和不知道的 HTML

关于 HTML,说几个你可能不太关注的问题。

Evan 的博客 4757

【目标跟踪】基于Kalman滤波实现无人机运动轨迹跟踪附matlab代码

1 简介 在近代控制中,需要对某一特定的运动目标进行跟踪监测,并需要对其下一时间的运动位置,运动方向,速度等信息进行预先估算,才能达到对目标的即时控制.本文简要讨论了用卡尔曼滤波算法对单个目标航迹进行预测,并借助于Matlab仿真工具,对实验的效果进行评估. 2 部分代码 clc; close all; %initial state xo=25; vox=2; %Observations **** % X-Direction Calcula

qq_59747472的博客 4731

生产者与消费者多线程 java_用Java实现生产者和消费者的多线程例子

任务说明:生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。使用Runnable接口完成该任务,代码如下:package...

weixin_39790738的博客 189

Meta新开源多语种语音基座Omnilingual ASR

Meta FAIR 团队最近祭出了,这不仅仅是对 MMS (Massively Multilingual Speech) 的简单升级,而是一次从“多任务学习”向“上下文学习(In-Context Learning)”的范式跃迁。通过将 Wav2Vec 2.0 编码器扩展至 70 亿参数,并引入 LLM 风格的 Decoder,Omnilingual ASR 不仅原生支持 1600+ 种语言,更具备了类似 GPT 的“零样本”扩展能力——只需给出几个音频-文本对,即可解锁从未见过的语言。

kakaZhui的博客 146

java 多线程 用阻塞队列实现生产者和消费者

import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; //阻塞队列实现生产者和消费者 public class BlockQueueTest { public static void main(String[] args) { Bl...

UFO_Z_CJ的博客 294

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java多线程——生产者和消费者 实现生产和消费的和谐状态

package ls0526; public class Run { // 产品 public static class Product { public int count=0; } // 生产者 public static class Producer implements Runnable { private Product product; ...

tcbdbd的博客 233

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java多线程 wait和notify方法 实现生产者和消费者

本示例实现生产者和消费者是用wait()和notifyAll()方法,这两个方法的使用比之前的suspend()和resume()方法的优势是 在synchronized方法包围的时候会释放锁,不会造成死锁。 缺点如果在一个方法中先执行notifyAll(),再执行wait()还是会造成死锁。 import java.util.*; public class ThreadCommunicat...

UFO_Z_CJ的博客 349

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java多线程生产者和消费者实现

一、概述 首先,我们需要明白生产者和消费者模型是为了解决多线程之间通信而产生的。其次,需要了解实现线程间通信用到了哪些知识点。先来看一张生产者和消费者模型图: 这里有四个对象,一个是生产者,一个是消费者,一个是容器,最后还有一个是需要生产的商品,虽然在图上没有体现出来。刚开始容器里面没有商品,消费者等待,生产者开始生产,当容器里面有商品了,生产者通知消费者去消费,如果生产的速度比较快,容器...

不将就 655

Java多线程之~~~~使用wait和notify实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满 的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就 涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候 让线程让出来资源等待,当有资源的时候再notify他们让他们继续

技术是我的毕生追求 9998

Java多线程操作案例-生产者和消费者实现

Java多线程操作案例-生产者和消费者实现生产者和消费者问题是线程操作中的一个经典案例,本文采用Java多线程来实现这一经典问题。 1、使用Java来实现,首先要分析这个问题需要几个类来实现: (1)这个问题本身就是一个类,即主类 ; (2)要有生产者类和消费者类; (3)生产什么,消费什么,所以需要一个物品类,这里使用电脑类 ,表示生产和消费电脑; (4)多线程操作,需要对资源区

雄心博博的博客 431

Java多线程实现生产者和消费者

本文展示了Java多线程通信的三种实现方式:1)使用synchronized、wait和notify实现生产者-消费者模型;2)优化后的多线程版本使用notifyAll避免死锁;3)采用JDK1.5的Lock和Condition接口实现更精细的线程控制。通过煤炭运输案例,演示了生产者(卡车)和消费者(锅炉)如何安全共享资源,包括线程同步、等待唤醒机制以及锁的使用。随着线程数量增加,文章逐步改进方案,最终使用ReentrantLock和Condition实现定向唤醒,解决了多线程环境下的资源竞争问题。

yachaorui的博客 221

Java多线程并发采用BlockingQueue阻塞队列实现生产者和消费者模式

1、BlockingQueue简介 BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。 一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue。 一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞...

小白轩的博客 1227

Java多线程之 使用wait和notify实现生产者消费者模型

Java多线程之 使用wait和notify实现生产者消费者模型

qq_43679366的博客 422

java 多个消费者_Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和lock多线程通讯和同步实现...

public class ProducterConsumerSample {public static void main(String[] args) {Resourse res = new Resourse();//两个生产者Producter producter1 = new Producter(res);Producter producter2 = new Producter(res);/...

weixin_32632831的博客 210

多线程-Java的经典实现-生产者和消费者模式

生产者和消费者模式是一种经典的并发编程模式,用于解决生产者和消费者之间的生产和消费问题。在该模式中,生产者负责生产数据并将数据放入共享的缓冲区(或队列)中,而消费者则负责从缓冲区中取出数据并进行消费。生产者和消费者之间通过共享的缓冲区进行通信,但彼此之间并不直接进行通信。

rainyonelove的专栏 1095

java 生产者消费者_Java 多线程实现生产者和消费者模式

一、生产者和消费者模式描述 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者从空间里取走数据。存在的问题:当生产者比消费者快时,消费者会漏掉一部分数据;当消费者比生产者快时,消费者会取走相同的数据。解决方案(考虑到线程安全问题,解决此问题有三种方式):同步代码块 同步方法 lock 锁机制, 通过创建 Lock ...

weixin_39568653的博客 151

java多线程经典案例:生产者和消费者实现的两种方式

生产者和消费者两种实现案例:同步函数实现、lock实现

CXY_fengye的博客 327
上一篇: springboot整合rabbitmq入门(一)
下一篇: java多线程批量处理list集合中的数据
若往夕之
博客等级 码龄9年 20粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值