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可以看成是一个传球手,负责把生产者线程处理的 ...
随机推荐
- CSS中的行内元素和块级元素
我们在构造页面时,会发现有的元素是上下排列的,而有的则是横向排列的,这是为啥子呢 看看上图,我们也没给他设置啥子属性咋就不一样了,其实是因为每个元素都有默认的 display 属性,比如 div ...
- Wepy在VScode中的高亮显示
小程序的wepy框架会生成后缀名为.wpy的文件,此文件用VScode打开时并不是高亮的,官方文档给我们提供了两种方案进行高亮 方案一: 1. 在 Code 里先安装 Vue 的语法高亮插件 Ve ...
- 【读书笔记】iOS-“一心多用”利用多线程提升性能
iPhone将具有支持不同类型多线程API的能力,这些API包括:POSIX线程,NSObject,NSThread和NSOperation. iPhone操作系统是一个真正的抢占式,多任务操作系统, ...
- Oozie简单配置与使用
1.Oozie英文翻译 驯象人 2.Oozie简介 一个基于工作流引擎的开源框架,由Cloudera公司贡献给Apache,提供对Hadoop Mapreduce.Pig Jobs的任务调度与协调. ...
- VUE组件 之 倒计时(防刷新)
思路: 一.效果图: 二.CSS代码 .box{ width: 300px; height: 100px; line-height: 100px; margin: 100px auto; backgr ...
- 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现
一,分布式事务简介 在当前互联网,大数据和人工智能的热潮中,传统企业也受到这一潮流的冲击,纷纷响应国家“互联网+”的战略号召,企业开始将越来越多的应用从公司内网迁移到云端和移动端,或者将之前孤立的IT ...
- Jni 线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?)
此文章是关于NDK线程的第二篇理论知识笔记.主要有两个点,如下: 1.pthread_create(Too many arguements, expected 1) ?2.线程中如何获取JNIEnv? ...
- 四则运算 Java 姚康友,黎扬乐
github项目传送门:https://github.com/yaokangyou/arithmetic 项目要求 功能列表 [完成] 使用 -n 参数控制生成题目的个数 [完成] 使用 -r 参数控 ...
- [20171121]rman backup as copy 2.txt
[20171121]rman backup as copy 2.txt --//昨天测试backup as copy ,备份时备份文件的文件头什么时候更新.是最后完成后还是顺序写入备份文件.--//我 ...
- python第七十七天---HTML
HTML5 :规则, 浏览器的通用规则 1.规则, 浏览器的通用规则 2.开发者: 学习html 规则 开发后台程序 - 写html文件 (当作模板) - 数据库获取数据,替换到指定的HTML文件中的 ...