生产者-消费者的经典例子

一个生产者与消费者的例子. 一个生产者与消费者的例子.一个生产者与消费者的例子.一个生产者与消费者的例子.一个生产者与消费者的例子.一个生产者与消费者的例子. 立即下载

 

package fighting;

public class ThreadProducerConsumer {

	/**
	 * 生产者-消费者的例子
	 * 对于多个生产者和消费者,为什么要定义while判断标记,
	 * 原因:让被唤醒的线程再一次判断标记。
	 * 
	 * 总结:当出现多个生产者和消费者的情况,必须使用while判断标记,用notifyAll唤醒线程。
	 * 
	 * 为什么使用notifyAll,因为需要唤醒对方线程,
	 * 只用notify,容易出现只唤醒本方线程的情况,导致程序中的所有线程都等待。
	 */
	public static void main(String[] args) {
		Resource1 res=new Resource1();
		new Thread(new Producer(res)).start();
		new Thread(new Producer(res)).start();
		new Thread(new Consumer(res)).start();
		new Thread(new Consumer(res)).start();//如果是多个线程消费,就有可能发生,生产者生产一个,不同消费者消费同一个产品的情况;
		                                      //或者生产者生产两次,消费者只消费了一次。

	}

}
class Resource1{
	private String name;
	private int count = 1;
	private boolean flag=false;
	/**
	 * 在这里分析一下:t1、t2是生产者线程,t3、t4是消费者线程。
	 * 假设t1先获取到cpu执行权,
	 * 一,t1进入set方法,判断if(flag)为false,t1生产一个商品,把flag置为true,t1接着又循环进入判断if(flag)为true,t1进入等待状态,放弃执行资格。
	 * 二,这时,假设t2获得cpu执行权,t2进入set方法,判断if(flag)为true,进入等待状态,放弃执行资格。
	 * 三,t3进入out方法,判断flag为true,消费一个商品,把flag置为false,notify唤醒t1,
	 *     但是t3才有执行权,t3判断if(flag)为false,t3进入等待,放弃资格。
	 * 四,t4进入out方法,进入等待,放弃资格。
	 * 五,此时t1是唤醒状态,生产一个商品,flag置为true,notify唤醒t2,t1仍有执行权,t1判断if(flag)为true,进入等待状态,放弃资格。
	 * 六,此时,t2处于唤醒状态,t2继续往下执行,而不会去判断if(flag)了,直接又生产一个商品,这就导致生产了两个商品。t2把flag置为true,notify唤醒t3,
	 *     t3这时只消费了t2生产的商品,t1生产的商品就没有消费了。
	 * 原因就是在线程唤醒后,没有再去判断flag,把if改为while就会实现唤醒后还会判断flag了。
	 * 但是这样,会发生几个线程都会等待。
	 * 这时就可以使用notifyAll方法解决问题。
	 * 
	 */
	public synchronized void set(String name){
//		if(flag){
		while(flag){//用while判断后,用this.notify唤醒本方,而不能唤醒对方,所以会导致都处于等待状态。
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.name=name+"--"+count++;
		System.out.println(Thread.currentThread().getName()+"...生产者"+this.name);
		flag=true;
//		this.notify();
		this.notifyAll();//notifyAll唤醒在此对象监视器上等待的所有线程
	}
	public synchronized void out(){
//		if(!flag){
		while(!flag){
			try {
				wait();//这里this省略了
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println(Thread.currentThread().getName()+"...消费者"+this.name);
		flag=false;
//		this.notify();
		this.notifyAll();
	}
}
class Producer implements Runnable{
	private Resource1 res;
	Producer(Resource1 res){
		this.res=res;
	}
	public void run(){
		while(true){
			res.set("商品");
		}
	}
}
class Consumer implements Runnable{

	private Resource1 res;
	Consumer(Resource1 res){
		this.res=res;
	}
	public void run(){
		while(true){
			res.out();
		}
	}
}


 

操作系统中生产者与消费者问题实例 C#编写的有关操作系统中生产者与消费者问题的实例,画面美观,生动形象的描绘了生产者与消费者之间的关系,代码部分简介易懂。 立即下载

相关推荐

PyCharm中Pyvips配置避坑指南:为什么pip安装后import还是报错?

本文详细解析了在PyCharm中配置Pyvips时,即使pip安装成功,import仍报错的根本原因。核心在于Pyvips依赖的libvips原生库未正确配置环境变量。文章提供了从下载libvips、配置Windows系统PATH到PyCharm项目级设置的完整避坑指南,并对比了三种配置策略,帮助开发者彻底解决DLL加载失败问题。

bush的博客 209

生产者消费者案例

目录前言一、案例描述二、创建快递柜三、创建生产者类四、创建消费者类五、测试类总结 前言 生产者消费者模式是属于经典的多线程协作的模式,弄清生产者消费者问题能够让我们对于多线程编程有更深刻的理解,下面,为大家分享一个生产者消费者的案例。 一、案例描述 这里以快递为例,假设有一个快递柜,用来存快递,然后有快递员和取件人,快递员往快递柜里存快递,取件人从快递柜中取走快递。快递员作为生产者,取件人作为消费者,当两者在一个时间段同时进行多次自己的操作时,很明显这就是多线程编程的生产者消费者实例了。在这里,我们希望

weixin_43427312的博客 3176

【网络图】:附Origin详细画图教程

网络图,是一种由节点(或顶点)和连接这些节点的边(或链路)组成的图形结构。在网络图中,节点通常代表系统中的一个实体(如项目中的一项任务、通信网络中的一个设备、或运输网络中的一个站点),而边则代表这些实体之间的直接联系或流动(如任务的先后顺序、数据的传输路径、或乘客的旅行路线)。 有向图:如果边具有方向性,即从一个节点指向另一个节点,则称为有向图。这种图常用于表示具有明确先后顺序或方向性的系统,如项目管理中的任务依赖关系。 无向图:如果图中的边没有方向,则称为无向图。它适用于表示实体间相互关联但无明确方向性的

weixin_50236590的博客 3954

Java_线程—经典的例子:生产者和消费者

线程,还有一个经常出现的例子:生产者和消费者。 一个生产,一个消费,中间就是产品,一个产品只能被一个生产者生产,同样,也只能被一个消费者消费。 既然是生产和消费,这就好理解了,现在也快中秋了,举个例子:生产月饼的厂家和消费者。厂家负责生产,消费者进行消费。厂家不断的生产,消费者就不断的消费,这有个前提,厂家生产月饼在前,消费者消费月饼在后,不能说消费者先消费月饼,然后厂家再去生产吧,这明显就不

不求重复造轮子,但必须要知道轮子是怎么造的。 1434

用R语言做WGCNA分析全步骤一(附代码解读)【转载】

代码逐句分析一、文章来源二、基因共表达网络构建及模块识别1.数据导入、清洗及预处理2.检查过度缺失值和离群样本3.聚类做离群样本检测4.载入临床特征数据三、自动构建网络及识别模块1.确定合适的软阈值:网络拓扑分析2.一步构建网络和识别模块 一、文章来源 初学WGCNA,觉得博主的代码写的很不错,但其中很多代码在第一遍看的时候有很多地方不理解,后查阅了很多资料,终于看明白了,于是写了一篇笔记,记录自己的学习心得,有不准确的地方,还望各位大佬们不吝赐教~ 原文链接:WGCNA简明指南 二、基因共表达网络构建及模

qq_43138237的博客 2万+

海康工业相机 Could not find module MvCameraControl.dll(已解决)

【代码】海康摄像机 Could not find module MvCameraControl.dll(已解决)

hmbbpdx的博客 2220

生产者-消费者问题(有例题!!!)

文章目录前言问题描述 前言 此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。 提示:以下是本篇文章正文内容 问题描述

CHEN的博客笔记 7307

ubuntu22.04 安装部署 openclaw

ubuntu22.04 安装部署 openclaw

nalanxiaoxiao2011的博客 967

生产者和消费者案例

1.案例描述 这里以吃饭为例,假设有一个桌子,用来存汉堡包,然后有厨师和消费者,厨师往桌子上放汉堡包,消费者从桌子上取走汉堡包。当两者在一个时间段同时进行多次自己的操作时,很明显这就是多线程编程的生产者消费者实例了。在这里,我们希望厨师每次生产一个汉堡包,消费者就拿走一个汉堡包,如果汉堡包还没有被取走,那么厨师应该等待,而如果桌子上没有汉堡包,则消费者应该等待。 2.案例分析 厨师类(Cooker):实现Runnable接口,包含放汉堡包的方法 消费者类(Foodie):实现Runnable接口,包含拿汉堡

m0_47649585的博客 802

机房电脑的“还原”秘密:如何应对重启即清零的困境

机房电脑重启后自动还原是常见的现象,这主要依靠硬件还原卡或软件还原系统(如冰点还原)实现。这类技术会定期将系统盘恢复初始状态,但通常不保护非系统盘。要高效使用公共电脑,建议:1)将个人文件存储在D/E盘;2)使用绿色便携软件;3)必要时可尝试通过热键临时关闭还原功能;4)养成云端备份习惯。掌握这些技巧既能遵守机房规定,又能保证学习资料安全,培养良好的数字资产管理能力。

一位主要以学校学生信息技术,社会工作生活讲解科普拓展的博主 1445

ODrive0.5.5源码分析(1) ADC的处理

odrive 0.5.5 ADC

danger的博客 4307

Java生产者、消费者模型——经典的多线程例子

Java生产者、消费者模型——经典的多线程例子,简单上手

weixin_67026971的博客 690

【CANoe】CANoe的 I/O功能-以VN1640A为例

Canoe的 I/O功能-以VN1640A为例

星Yeah 的博客 7867

线程并发 经典例子 生产者与消费者

回顾了一下---- 很久以前的只是 常用的: 1、synchronized 修饰方法 , 2、synchronized 代码块 ---------- 属于对象 1,2 功能一样 只不过 代码块修饰的 比较方便 2、static synchronized 修饰方法 --------属于类 结论:A: synchronized static是某个类的范围,synch...

Crayon的博客 1659

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

多线程通信经典例子:生产者/消费者问题

多线程通信一个经典例子:生产者/消费者问题 先一起来看一下题目 一个生产者(producer)生产一件产品,当产品数量超过20时将不再生产,另有一个消费者(consumer)问店员(clerk)来购买这个产品,当产品数量少于或等于时,店员将不再售卖这件产品 分析一下题目 需不需要使用多线程?需要,一条是生产者的线程,一条是消费者的线程 需不需要共享数据?需要,共享数据为店员,或者产品 共享数据的时候会不会出现线程安全问题?会,需要用synchronized或者lock来解决 需不需要线程之间进行通信?需要

Yellow_Star的博客 281

JAVA多线程例子,经典的生产者与消费者

要求:1、消费者无数据消费则进入等待;2、生产者满仓则进入等待;代码如下:package mythread; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedList; /** * 测试多线程,生产者和消费者 * Created by Administrator on 2018...

BaShengJin的博客 526

java 多线程经典例子——生产者与消费者的问题

产品名称类: public class Product { //产品名称 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }生产者类:/** * 生产者 * @author 饭

zxman660的专栏 4326

【Java学习笔记】多线程同步经典例子:生产者消费者问题

生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。 class Clerk { // 售货员 private ...

ENKU1的博客 291

几个java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者

其中读者写者和贪睡的理发师使用的Semaphore类;生产者消费者使用的是管程。 读者写者: class Semaphore { int value; public Semaphore(int v) { this.value = v; } public synchronized void p() { valu...

wusutata的专栏 2122

java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者。

几个java实现的PV操作经典例子:读者写者、贪睡的理发师、生产者消费者

孤芳不自赏 973

多线程经典例子--生产者、消费者(1)

/* 生产者,消费者。 多生产者,多消费者的问题。 if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。 while判断标记,解决了线程获取执行权后,是否要运行! notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。 notifyAll解决了本方线程一定会唤醒对方线程的问题。 */ class Resourc

ruanhao1203的专栏 1451

多线程经典例子--生产者、消费者(2)Lock锁和Condition

/* jdk1.5以后将同步和锁封装成了对象。 并将操作锁的隐式方式定义到了该对象中, 将隐式动作变成了显示动作。 Lock接口: 出现替代了同步代码块或者同步函数。将同步的隐式锁操作变成现实锁操作。 同时更为灵活。可以一个锁上加上多组监视器。 lock():获取锁。 unlock():释放锁,通常需要定义finally代码块中。 Condition接口:出现替代了Object中的wait

ruanhao1203的专栏 222

线程通信——经典的生产者—消费者问题

线程通信,经典的生产者消费者问题: 在一个商店里,售货员负责销售某件产品,生产者将产品交给售货员,而消费者取走产品,假设商店里产品数量不能超过20个,如果生产更多产品售货员会让生产者停下,等数量少于20时继续生产;如果没有产品了售货员会告诉消费者等待,等产品来了再通知消费者取走产品。 上代码: package java1; class Clerk{ private int number=0; public synchronized void consumeProduct() { if(numbe

the Commitments的博客 179

生产者消费者模型

将上述场景例比到我们实际的软件开发过程中,经常会见到这样一幕:代码的某个模块负责生产数据(供货商),而生产出来的数据却不得不交给另一模块(消费者)来对其进行处理,在这之间我们必须要有一个类似上述超市的东西来存储数据(超市),这就抽象除了我们的生产者/消费者模型。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

kalvin_y_liu的博客 6940

生产者和消费者问题

生产者和消费者问题 一、维基百科   生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多进程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消...

CourageHe的博客 481
上一篇: 线程间通信
下一篇: 生产者-消费者的经典案例升级版(jdk1.5版)
wangpanbaoding
博客等级 码龄18年 42粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值