java中使用阻塞队列实现生产这与消费这之间的关系
需求如下:
有一个生产者和一个消费者,生产者不断的生产产品,消费这不断的消费产品.产品总数为N.
1.生产顺序按队列的方式,先进先出.
2.生产者和消费这可以同时进行.
3.当生产者生产了N个产品后不能继续生产,消费者消费完后不能继续消费.
4.当生产完成,或者消费完成时,要节约CPU开支(不能使用Sleep);
5.尽量少定义变量,高效率实现.
说明:花了一个小时实现的,如果有不同的意见,希望大家能够指出,共同学习共同进步.
下面说一下我分析的过程:
题目上说:
1.有一个生产者和消费者,这个告诉我们至少要建立两个线程,一个生产者线程,一个消费者线程
2.由生产顺序:先进先出,告诉我们应该使用一个队列.
3.生产和消费可以同时进行:告诉我们至少我们应该考虑并发的问题,我正在生产时你别来消费.
4.要节约CPU开支和生产,消费完成后不能继续生产或者消费:告诉我们而且不能使用Sleep,那么我们应该想到的是,使用wait或者阻塞队列.
抽象一下模型:创建两个线程,一个用于不断的向集合中添加数据,一个不断的向集合中取除数据,如果集合已满,则进行阻塞,如果取数据是集合为空则仍然进行阻塞.
好了下面贴出源代码,如果中间有什么不明白的大家可以查看java jdk帮助文档,上面都有介绍,我这里就不再说了.
生产者:
package cn.yw.daydayinterviewquestion; import java.util.concurrent.ArrayBlockingQueue; public class MainTest {
/**
* 程序的入口main方法
*
* @param args
*/
public static void main(String[] args) {
final WorkShop workShop = new WorkShop();
// production
new Thread() {
public void run() {
while(true){
try {
workShop.production();
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}.start();
// customer
new Thread() {
public void run() {
while(true){
try {
workShop.customer();
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}.start();
} /**
* 车间类
*
* @author yw-tony
*
*/
static class WorkShop {
private int i = 0;
private int countNum = 100;//产品总量
// 产品队列
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1);
//加上互斥技术以防止生产者生产到一半时消费这就消费了.
// 生产方法
public synchronized void production() throws Exception{
if (i < countNum) {
i++;
/*System.out.println("线程" + Thread.currentThread().getName()
+ "准备生产产品." + i);*/
queue.put(i);
System.out.println("线程" + Thread.currentThread().getName()
+ "生产了产品." + i);
}else{
System.out.println("生产完成,等待中....");
queue.take();
} } // 消费方法
public synchronized void customer() throws Exception{
/*countNum--;
System.out.println("准备消费产品"+countNum);*/
//消费完成的依据是,消费数等于产品数
Integer c = queue.take();//检索并移除此队列的头部,如果次队列为空,这一直处于等待状态.
System.out.println("消费了产品"+c);
if(c >= 100){
System.out.println("消费完成,正在等待商品产出.....");
}
} }
}
备注:在这里不用阻塞队列也是可以的,使用线程之间的通信技术一样能够实现,有兴趣的朋友可以写一下,我这里就不写了.
java中使用阻塞队列实现生产这与消费这之间的关系的更多相关文章
- Java中的阻塞队列(BlockingQueue)
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- 多线程编程学习六(Java 中的阻塞队列).
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...
- 阻塞队列一——java中的阻塞队列
目录 阻塞队列简介:介绍阻塞队列的特性与应用场景 java中的阻塞队列:介绍java中实现的供开发者使用的阻塞队列 BlockQueue中方法:介绍阻塞队列的API接口 阻塞队列的实现原理:具体的例子 ...
- 聊聊并发(七)——Java中的阻塞队列
3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...
- Java中的阻塞队列-ArrayBlockingQueue(一)
最近在看一些java基础的东西,看到了队列这章,打算对复习的一些知识点做一个笔记,也算是对自己思路的一个整理,本章先聊聊java中的阻塞队列 参考文章: http://ifeve.com/java-b ...
- JUC之Java中的阻塞队列及其实现原理
在文章线程池实现原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了线程池的组成部分,其中一个组成部分就是阻塞队列.那么JAVA中的阻塞队列如何实现的呢? 阻塞队列,关键字是阻塞 ...
- Java中的阻塞队列
1. 什么是阻塞队列? 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用 ...
- java 中的阻塞队列
1.什么是阻塞队列: 支持阻塞的插入方法,意思是当队列满时,队列会阻塞插入元素的线程,知道队列不满. 支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空. 插入和移除操作的4种处 ...
- Java中的阻塞队列-SynchronousQueue
SynchronousQueue是一个不存储元素的阻塞队列.每一个put操作必须等待一个take操作,否则不能继续添加元素.SynchronousQueue可以看成是一个传球手,负责把生产者线程处理的 ...
随机推荐
- vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效解决方法
我要实现的功能是在上传文件之前校验是否表格中存在重复的数据,有的话,需要弹窗提示是否覆盖,确认之后继续上传,取消之后,就不再上传. 项目中用的element-ui是V1.4.3 <el-uplo ...
- 限制Apache日志access.log、error.log文件大小
在 Windows 下的设置例子如下: # 限制错误日志文件为 1M ErrorLog "|bin/rotatelogs.exe -l logs/error-%Y-%m-%d.log 1M& ...
- Java并发编程(六)volatile关键字解析
由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识. 一.内存模型的相关概念 Java内存模型规定所有的变量都是存在 ...
- Android View体系(八)从源码解析View的layout和draw流程
前言 上一篇文章我们讲了View的measure的流程,接下来我们讲下View的layout和draw流程,如果你理解了View的measure的流程,那这篇文章自然就不在话下了. 1.View的la ...
- postmortem报告
beta阶段与alpha阶段的比较 beta阶段与alpha阶段的比较主要从个人方面和团队方面进行总结. 以下是我们的队员对于自己在beta阶段的实践和alpha阶段的改进的总结. 成员林静雯认为,自 ...
- 一文读懂遗传算法工作原理(附Python实现)
选自AnalyticsVidhya 参与:晏奇.黄小天 近日,Analyticsvidhya 上发表了一篇题为<Introduction to Genetic Algorithm & t ...
- 点击eclipse包报错
每次只要新建一个package包,或者鼠标选择某个package包,系统就会提示:An error has occurred. See error log for more details. org/ ...
- VS2015 无法启动 IIS Express Web 服务器 解决方案
VS2015 IIS Express 无法启动Web 解决方案 [亲测已成功] 1.我的电脑—管理—事件查看器—Windows日志—应用程序: 详细信息会提示你:[模块 DLL C:\Program ...
- win10系统如何关掉系统自动更新
越来越多的电脑使用者都在使用Windows10系统,尽管系统是一代代更新的,但难免有槽点,Windows10系统也不例外,最大的槽点就是“自动更新”的功能.当然,“自动更新”的功能也是相当有用处的. ...
- February 4th, 2018 Week 6th Sunday
Hope clouds observation. 心怀希望会蒙蔽双眼,影响判断. Almost every of us thinks we would be the master of our liv ...