生产者-消费者 BlockingQueue 运用示例
简单说明:
1、生产者负责将字符串转换成int 数字放入BlockingQueue,失败就停止生产消费线程。
2、消费者从BlockingQueue获得数字,取平方根值,并累积值。如果有负数,失败!停止生产消费线程。
3、模拟一个生产者,2个消费者。为了能均衡对应,生产者每次暂停 10毫秒,消费每次暂停23 毫秒~~
代码:
public class ThreadTest {
private final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>( 5 );
/**计算结果**/
private final AtomicInteger atoInt = new AtomicInteger(0);
/**整个计算过程是否成功**/
private final AtomicBoolean isSuccess = new AtomicBoolean(true);
private Thread t1 = null;
private Thread t2 = null;
private Thread t3 = null;
private final CountDownLatch endGate = new CountDownLatch( 2 );
public static void main(String[] args) throws InterruptedException {
String[] data = new String[]{ "1", "1", "4", "9", "25", "36", "49", "64", "81", "144"};
ThreadTest test = new ThreadTest();
Producter p = test.new Producter(data);
Consumer c1 = test.new Consumer();
Consumer c2 = test.new Consumer();
test.t1 = new Thread(p);
test.t2 = new Thread(c1);
test.t3 = new Thread(c2);
test.start();
test.endGate.await();
if( test.isSuccess.get() ){
System.out.println( "计算结果:" + test.atoInt.get() );
}
else{
System.out.println( "计算过程中遇到错误!" );
}
}
private void start(){
t1.start();
t2.start();
t3.start();
}
private void stop(){
t1.interrupt();
t2.interrupt();
t3.interrupt();
}
private class Producter implements Runnable{
private final String[] data;
public Producter(String[] data) {
super();
this.data = data;
}
@Override
public void run() {
try {
for( String s : data ){
//System.out.println( "当前读取数:" + s );
int i = Integer.valueOf( s );
queue.put( i );
Thread.sleep( 10 );
}
queue.put( Integer.MAX_VALUE );
} catch (NumberFormatException e) {
e.printStackTrace();
isSuccess.set(false);
stop();
return;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
private class Consumer implements Runnable{
@Override
public void run() {
try {
while( !Thread.currentThread().isInterrupted() ){
int i = queue.take();
Thread.sleep( 23 );
//遇到错误值
if( i<0 ){
stop();
isSuccess.set(false);
break;
}
//结束标志
else if( i == Integer.MAX_VALUE ){
stop();
break;
}
//System.out.println( Thread.currentThread() + "当前queue获取数:" + i );
atoInt.addAndGet( (int)Math.sqrt(i) );
//System.out.println( atoInt.get() );
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
finally{
endGate.countDown();
}
}
}
}
生产者-消费者 BlockingQueue 运用示例相关推荐
- python 生产者-消费者模型 - 代码示例
代码示例 #!/usr/bin/env python #encoding: utf-8 import threading import timecondition = threading.Condit ...
- 高并发编程-线程生产者消费者的综合示例
文章目录 需求 实现 需求 需求: 假设有10个线程,最多同时运行5个 要求: 不使用线程池,使用synchronized-wait¬ifyAll机制 实现 详见注释 package c ...
- 11.python并发入门(part8 基于线程队列实现生产者消费者模型)
一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据 ...
- 秒杀多线程第十篇 生产者消费者问题
继经典线程同步问题之后,我们来看看生产者消费者问题及读者写者问题.生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消 ...
- java信号量生产者_java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- 使用Java的BlockingQueue实现生产者-消费者
BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1.ArrayBl ...
- Java多线程(十):BlockingQueue实现生产者消费者模型
BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...
- 生产者-消费者中的缓冲区:BlockingQueue接口
BlockingQueue接口使用场景 相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者- ...
最新文章
- UI Automator Viewer Error while obtaining UI hierarchy XML file
- [R]R语言中的%%和%.%
- Linux中find命令详解
- php header 404 nginx,ThinkPHP在nginx下怎么设置?路由统统404,疯了~
- 关于grep,egrep正则表达式的常用用法
- 初识推荐算法---算法背景、算法概念介绍、推荐信息选取、常用推荐算法简介
- Effective C++ 精要(第五部分:实现)
- 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)
- 关于Bitmapimage图片保存(png格式)
- axure 教务系统_AxureRP免费(教育)授权密钥申请攻略
- Unity粒子特效系列-龙卷风预制体做好了,unitypackage包直接用!
- 一眼看出二叉树中序遍历结果的诀窍
- 嵌入式--LCD常用接口介绍
- 微信小程序 默认第一个选中变色
- lvds接口屏线安装图解_lvds液晶屏幕接口详细讲解
- 反向传值的几种常用方法
- 偏微分方程的物理含义
- 光纤模式图matlab模拟
- 微信平台小游戏AVG开发教程入门
- python 列表操作之合并
热门文章
- 论文浅尝 | 基于异质图交互模型进行篇章级事件抽取
- 论文浅尝 | AAAI2020 - 基于规则的知识图谱组合表征学习
- 公开课 | 知识图谱构建与应用概述
- Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you
- 委托、Lambda表达式、事件系列07,使用EventHandler委托
- python D28 粘包
- php新特性:trait 关键字使用
- CodeForces 869E The Untended Antiquity 二维树状数组,随机hash
- 使用代理下载Unity AssetStore上资源的方法
- c语言,递归翻转一个单链表,c实现单链表