`

<找工作 十>生产者 消费者模型

    博客分类:
  • java
 
阅读更多

 今天被问了个这个问题,脑子当时给抽筋了,完全给木掉了,回来好好写了边,怎么会当时写不出来呢。。。

 

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test421 extends Thread {
	public void run() {
		Customer a = new Customer();
		a.start();
		Producer b = new Producer();
		b.start();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Test421 c = new Test421();
		c.start();
	}

	int key = 0;
	Lock lock = new ReentrantLock();
	Condition condempty = lock.newCondition();
	Condition condfull = lock.newCondition();

	class Customer extends Thread {
		public void run() {
			while (true) {

				lock.lock();

				try {
					while (key < 1) {
						// System.out.println("await");
						condempty.await();
						// System.out.println("start");
					}
					System.out.println("消费了" + key);
					key--;
					condfull.signalAll();
					lock.unlock();

					// return ;
					Thread.sleep(12);

				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	class Producer extends Thread {
		public void run() {
			while (true) {
				try {
					// Thread.sleep(50);
					lock.lock();
					while (key >= 1000) {
						condfull.await();
					}

					// a++;
					key++;
					System.out.println("生产了" + key);

					// Thread.sleep(5000);
					condempty.signalAll();
					lock.unlock();

					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
 

锁和条件这种方式比较重要的一点要注意的是:就算condition.sigalAll();别的线程也一定要等到lock的释放才可以继续下去,换句话说,await的时候很重要的一点是他会阻塞掉,并且隐含的会释放掉锁,这很关键,只有这样别的线程才能获得锁,才能继续执行下去。

而  sigalAll  的时候并不执行释放锁操作,只有显示的调用lock.unlock后,锁才被释放。

分享到:
评论

相关推荐

    参考教材 数学模型(第3版),姜启源等编

    例如,森林救火模型可能涉及在火灾扩散速度和灭火成本之间找到最佳平衡点,而消费者均衡则需要考虑消费者的收入、商品价格和偏好,以确定消费组合的最优化。 在建立静态优化模型时,通常会假设产品需求量、生产准备...

    农产品电商创业者胜任力模型研究.zip

    1. 市场洞察力:农产品电商创业者需对市场趋势有敏锐的观察力,理解消费者需求,把握市场动态,以便做出正确的产品定位和商业决策。 2. 技术应用能力:熟悉电子商务平台的操作,掌握网络营销技巧,包括SEO优化、社交...

    Kafka详解及常见面试问题解析(值得珍藏)

    - 单消费者模型:一个消费者实例独占一个或多个分区。 - 消费者组模型:多个消费者实例组成一个消费者组,共享主题的所有分区。 3. **Kafka的高可用是如何实现的?** - 分区副本机制:每个分区有多个副本,主...

    面试专题-RabbitMQ专题部分

    RabbitMQ的核心概念包括生产者、消费者、交换器、队列和绑定。生产者发送消息到交换器,交换器根据预设的路由规则将消息分发到相应的队列。消费者从队列中接收消息并进行处理。 **2. 交换器类型** RabbitMQ支持...

    java面试,经典的八股文208题测试

    - RabbitMQ 和 Kafka 作为消息中间件,理解发布/订阅和生产者/消费者模型。 - 消息的可靠传输,以及死信队列、延迟队列的应用。 15. **Zookeeper** - Zookeeper 的角色和功能,如分布式协调、配置管理、命名服务...

    通过实际例子来学习和练习Go并发模式,提供了测试用例来验证您的答案.zip

    例如,生产者消费者模型通常通过一个channel来协调生产者goroutine和消费者goroutine的工作: ```go go producer(ch) go consumer(ch) ``` 其中,生产者向channel发送数据,消费者从channel接收数据。 4. **...

    百度2014校园招聘笔试试题-技术类软件研发.doc

    在2014年百度的校园招聘中,技术类软件研发岗位的笔试题目主要考察了应聘者的Java虚拟机(JVM)理解、Servlet生命周期、volatile关键字的掌握以及生产者消费者模型的编程实现等核心知识点。下面将对这些关键点进行...

    《数据库性能调优--原理与技术》

    文件"数据库管理系统资源的生产者-消费者层次结构.vsd"可能是一个Visio绘制的数据库系统资源的生产者-消费者模型图。在数据库系统中,生产者-消费者模型常用于描述数据的读写流程,尤其是在并发环境下。生产者负责...

    改善C#程度的50种方法

    17. **掌握并发和异步设计模式**:如生产者消费者模型,线程池的使用等。 18. **学习并使用C#的新特性**:如C# 6及更高版本引入的特性,如null条件运算符(?.)、属性初始化器等。 19. **理解并应用设计模式**:如...

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    1-2属性对齐和归因在商品企划中的应用.pdf

    《属性对齐与归因在商品企划中的应用》 在商品企划中,属性对齐和归因是至关重要的环节。...通过不断迭代和改进模型,我们可以更准确地预测商品的市场表现,从而指导生产和营销策略,满足消费者多样化的需求。

    基于模型的闭环尺寸质量管理.pptx

    例如,汽车大灯周边缝隙过大的问题,不仅影响产品的外观感知质量,还可能引发消费者对品牌质量的疑虑。MBQ的目标是在设计初期就预测和控制偏差,通过预测分析找出关键影响因素,确保从设计到制造的全过程管理,形成...

    面试专题-Kafka专题部分

    - **生产者(Producer)**:负责将消息发布到Kafka主题。 - **消费者(Consumer)**:订阅主题并消费消息。 - **消费者组(Consumer Group)**:一组消费者,每个分区只能被组内的一个消费者消费,确保数据的唯一...

    基于Android的面试宝典.zip

    生产者消费者模型 线程池的实现方式 JVM相关(1.271.31) 垃圾回收机制 分代回收算法 垃圾回收算法 类加载过程(双亲委托) JMM(Java内存结构模型) Android基础(1.251.27) 四大组件(Activity、...

    面试专题-ActiveMQ专题部分

    消息队列允许生产者和消费者异步工作,提高系统性能和容错能力。 2. **ActiveMQ的主要特性**: - **持久化**:ActiveMQ支持消息的持久化存储,即使在服务器重启后也能保证不丢失数据。 - **多种协议支持**:包括...

    社招面试经验总结.docx

    2. **并发编程中的生产者消费者模式**:面试中提到的生产者消费者模式是一种典型的多线程协作模型,通过wait()和notify()方法可以实现线程间的同步与通信。此外,使用ReentrantLock、CountDownLatch等高级并发工具也...

    消息中间件面试专题及答案

    - **点对点(Point-to-Point, P2P)**:P2P模式类似于一对一的通信,生产者发送消息到一个队列,消费者从队列中取出并消费消息。一个队列通常只有一个消费者,但可以有多个备份消费者。在P2P模式下,消息不会丢失,...

    12_总结一下消息队列相关问题的面试技巧.zip

    - 消息队列(Message Queue, MQ)是一种中间件,用于在分布式系统中解耦生产者和消费者,通过存储和转发消息来协调不同组件的通信。 - 主要角色包括生产者(Producer)、队列(Queue)、代理(Broker)和消费者...

    社招面试经验总结.pdf

    其次,面试中还涉及了并发编程的生产者消费者模式。这是一种多线程协作的模式,面试者提到可以通过wait和notify实现,或者使用更高级的并发工具如ReentrantLock、CountDownLatch等。未能现场编写代码可能是因为对...

Global site tag (gtag.js) - Google Analytics