生产者消费者问题--BlockingQueue
# 代码:
public class App { public static void main(String[] args) { BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(6);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue); producer.produce(5);
consumer.consume(4);
producer.produce(3);
consumer.consume(2);
}
} class Producer {
private BlockingQueue<Integer> queue; public Producer(BlockingQueue<Integer> queue) {
this.queue = queue;
} public void produce(final int val) {
new Thread() {
public void run() {
try {
int surplus = val;
while (surplus > 0) {
queue.put(1024);
surplus--;
System.out.printf("%s plan to produce (%d), actually produce (%d), queue size (%d) \n",
Thread.currentThread().getName(), val, 1, queue.size());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
} class Consumer {
private BlockingQueue<Integer> queue; public Consumer(BlockingQueue<Integer> queue) {
this.queue = queue;
} public void consume(final int val) {
new Thread() {
public void run() {
int surplus = val;
try {
while (surplus > 0) {
queue.take();
surplus--;
System.out.printf("%s plan to consume (%d), actually consume (%d), queue size (%d) \n",
Thread.currentThread().getName(), val, 1, queue.size());
}
} catch (InterruptedException e) {
e.printStackTrace();
} }
}.start();
}
}
# 输出:
Thread-0 plan to produce (5), actually produce (1), queue size (1)
Thread-3 plan to consume (2), actually consume (1), queue size (0)
Thread-2 plan to produce (3), actually produce (1), queue size (1)
Thread-1 plan to consume (4), actually consume (1), queue size (0)
Thread-2 plan to produce (3), actually produce (1), queue size (1)
Thread-3 plan to consume (2), actually consume (1), queue size (0)
Thread-0 plan to produce (5), actually produce (1), queue size (1)
Thread-2 plan to produce (3), actually produce (1), queue size (1)
Thread-1 plan to consume (4), actually consume (1), queue size (0)
Thread-0 plan to produce (5), actually produce (1), queue size (2)
Thread-1 plan to consume (4), actually consume (1), queue size (1)
Thread-1 plan to consume (4), actually consume (1), queue size (1)
Thread-0 plan to produce (5), actually produce (1), queue size (2)
Thread-0 plan to produce (5), actually produce (1), queue size (2)
# 有四个线程参与了这个过程,两个生产者,两个消费者
生产者消费者问题--BlockingQueue的更多相关文章
- 多线程-生产者消费者(BlockingQueue实现)
三.采用BlockingQueue实现 BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需 ...
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- 使用BlockingQueue的生产者消费者模式
BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利.使用场景. 首先它是一个队列,而一个队 ...
- 生产者-消费者模型的3种Java实现:synchronized,signal/notifyAll及BlockingQueue
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3555111.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- 使用Java的BlockingQueue实现生产者-消费者
http://tonl.iteye.com/blog/1936391 使用Java的BlockingQueue实现生产者-消费者 博客分类: Java JavaBlockingQueue阻塞队列 B ...
- Queue和BlockingQueue的使用以及使用BlockingQueue实现生产者-消费者
Java提供了两种新的容器类型:Queue和BlockingQueue. Queue用于保存一组等待处理的元素.它提供了几种实现,包括:ConcurrentLinkedQueue,这是一个先进先出的并 ...
- Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例
Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...
- 生产者-消费者中的缓冲区:BlockingQueue接口
BlockingQueue接口使用场景相信大家对生产者-消费者模式不陌生,这个经典的多线程协作模式,最简单的描述就是生产者线程往内存缓冲区中提交任务,消费者线程从内存缓冲区里获取任务执行.在生产者-消 ...
- Java多线程(十):BlockingQueue实现生产者消费者模型
BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...
随机推荐
- C++ N叉树的实现
引言 最近一个项目需要使用多叉树结构来存储数据,但是基于平时学习的都是二叉树的结构,以及网上都是二叉树为基础来进行学习,所以今天实现一个多叉树的数据结构. 理论基础 树和二叉树: 多叉树:多叉树,顾名 ...
- 前端面试经典题之apply与call的比较
在讲apply和call之前,我们需要先清楚在js中,this指向的是什么. 大家可以参考一下阮一峰老师写的关于JavaScript中this的原理讲解文章:http://www.ruanyifeng ...
- 架构模式: 健康检查API
架构模式: 健康检查API 上下文 您已应用微服务架构模式.有时,服务实例可能无法处理仍在运行的请求.例如,它可能已用完数据库连接.发生这种情况时,监控系统应生成警报.此外,负载平衡器或服务注册表不应 ...
- 【FFMPEG】ffmpeg 时间戳问题汇总
ffmpeg 时间戳问题汇总 http://www.cnblogs.com/loveclover/archive/2011/03/23/1993065.html 问题是这样的 用一个 VLC(流媒体客 ...
- Jquery的深浅拷贝涉及到的知识点
1.安全的类型检测 Object.prototype.toString.call(obj) => "[object NativeConstructorName]" /** * ...
- 《ThinkPHP 5.0快速入门》 请求和响应
1.请求对象 //传统调用$request = Request::instance();//实例化对象 $request->url();//获取当前的域名 //继承think\Controlle ...
- addRoutes进行权限控制
用addRoutes实现动态路由:https://www.jianshu.com/p/0bea4a1b0350 详解基于vue,vue-router, vuex以及addRoutes进行权限控制:ht ...
- jumpserver跳板机(堡垒机)安装
jumpserver跳板机(堡垒机) Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能,基于ssh协议来管理,客户端无需安装agent,助力互联网企业 ...
- 【转帖】Office的光荣历史(1)
Office的光荣历史(1) https://www.sohu.com/a/201410882_657550 微软的第一版本的office 竟然是 给Mac OS 提供的.. 2017-10-31 1 ...
- 批量删除redis的数据
批量删除redis的数据 # redis-cli -h 192.168.1.17 -p 6379 keys "xiaolang_*"|xargs redis-cli -h 192. ...