简单说明:

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 运用示例相关推荐

  1. python 生产者-消费者模型 - 代码示例

    代码示例 #!/usr/bin/env python #encoding: utf-8 import threading import timecondition = threading.Condit ...

  2. 高并发编程-线程生产者消费者的综合示例

    文章目录 需求 实现 需求 需求: 假设有10个线程,最多同时运行5个 要求: 不使用线程池,使用synchronized-wait&notifyAll机制 实现 详见注释 package c ...

  3. 11.python并发入门(part8 基于线程队列实现生产者消费者模型)

    一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据 ...

  4. 秒杀多线程第十篇 生产者消费者问题

    继经典线程同步问题之后,我们来看看生产者消费者问题及读者写者问题.生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消 ...

  5. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  6. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  7. 使用Java的BlockingQueue实现生产者-消费者

    BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类 1.ArrayBl ...

  8. Java多线程(十):BlockingQueue实现生产者消费者模型

    BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...

  9. 生产者-消费者中的缓冲区:BlockingQueue接口

    BlockingQueue接口使用场景 相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者- ...

最新文章

  1. UI Automator Viewer Error while obtaining UI hierarchy XML file
  2. [R]R语言中的%%和%.%
  3. Linux中find命令详解
  4. php header 404 nginx,ThinkPHP在nginx下怎么设置?路由统统404,疯了~
  5. 关于grep,egrep正则表达式的常用用法
  6. 初识推荐算法---算法背景、算法概念介绍、推荐信息选取、常用推荐算法简介
  7. Effective C++ 精要(第五部分:实现)
  8. 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)
  9. 关于Bitmapimage图片保存(png格式)
  10. axure 教务系统_AxureRP免费(教育)授权密钥申请攻略
  11. Unity粒子特效系列-龙卷风预制体做好了,unitypackage包直接用!
  12. 一眼看出二叉树中序遍历结果的诀窍
  13. 嵌入式--LCD常用接口介绍
  14. 微信小程序 默认第一个选中变色
  15. lvds接口屏线安装图解_lvds液晶屏幕接口详细讲解
  16. 反向传值的几种常用方法
  17. 偏微分方程的物理含义
  18. 光纤模式图matlab模拟
  19. 微信平台小游戏AVG开发教程入门
  20. python 列表操作之合并

热门文章

  1. 论文浅尝 | 基于异质图交互模型进行篇章级事件抽取
  2. 论文浅尝 | AAAI2020 - 基于规则的知识图谱组合表征学习
  3. 公开课 | 知识图谱构建与应用概述
  4. Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you
  5. 委托、Lambda表达式、事件系列07,使用EventHandler委托
  6. python D28 粘包
  7. php新特性:trait 关键字使用
  8. CodeForces 869E The Untended Antiquity 二维树状数组,随机hash
  9. 使用代理下载Unity AssetStore上资源的方法
  10. c语言,递归翻转一个单链表,c实现单链表