生产者消费者问题--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.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...
随机推荐
- AP注册
1.ac发现ap 两种模式:二层发现.三层发现 按ap与ac所处ip网段不同,可以把注册过程分为二层模式和三层模式: 两种模式均通过发送discovery报文进行,二层模式discovery报文仅在同 ...
- 当你使用Pycharm编译程序的时候,遇到了这个问题,该怎么办?please select a valid interpreter
1.打开settings(CTRL + ALT + S)或者 file---setting 2.搜索 Interpreter 3.安装一个python的解释器,自行去官网下载,安装的时候,记得勾选配置 ...
- CentOS7怎么安装图形界面
step1: 进入下载页,选择阿里云站点进行下载 Actual Country 国内资源 Nearby Countries 周边国家资源 阿里云站点:http: ...
- centOS重启网络服务报错
1:启动网卡报错(Failed to start LSB: Bring up/down networking )解决办法总结 将 NetworkManager关闭, systemctl stop Ne ...
- FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux
Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...
- layui时间显示
第一次使用layui框架吧!记录layui踩到的坑! 个人洁癖,不太喜欢显示时分秒. 最后终于找到解决方案了! 代码如下: {field: 'ctime',title: '时间',templet:&q ...
- Yii2.0 queue
https://www.yiichina.com/tutorial/1635 https://my.oschina.net/gcdong/blog/3031113 https://www.yii-ch ...
- PHPstorm配置同步服务器文件
一.配置服务器 1.连接配置 打开菜单栏 Tools -> Deployment -> Configuration 点击 + 选择 SFTP,并填写相关服务器信息: Type:连接类型,这 ...
- python中while循环打印星星的四种形状
在控制台连续输出五行*,每一行星号数量一次递增 * ** *** **** ***** #1.定义一个行计数器 row = 1 while row <= 5: #定义一个列计数器 col = 1 ...
- JS 装饰器,一篇就够
更多文章,请在Github blog查看 在 ES6 中增加了对类对象的相关定义和操作(比如 class 和 extends ),这就使得我们在多个不同类之间共享或者扩展一些方法或者行为的时候,变得并 ...