生产者消费者问题--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.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...
随机推荐
- python基础知识(函数)
创建函数 def 函数名(可以选参数): 可选参数 ''' ''' 用三引号括起来的注释 说明功能和参数信息 可选参数指定函数体 执行函数程序代码 创建一个空函数 def empty(): p ...
- 【CSS】聊一聊css的选择器
对于css来说,他的基本语法就是 选择器 { K:V; K:V; K:V } 所以css的学习就分为两个部分: * 1 选择器 ...
- (长期更新)【python数据建模实战】零零散散问题及解决方案梳理
注1:本文旨在梳理汇总出我们在建模过程中遇到的零碎小问题及解决方案(即当作一份答疑文档),会不定期更新,不断完善, 也欢迎大家提问,我会填写进来. 注2:感谢阅读.为方便您查找想要问题的答案,可以就本 ...
- ARM 时区修改
ARM时区修改 ARM开发板环境时间设置好之后,重启会又变了,与之前设置时间正好相差8个小时,应该是时区的问题. 使用date查看时间是UTC时间而不是CST,解决办法: 从ubuntu中拷贝/usr ...
- Oracle-DQL 6- 子查询
子查询: --查询emp表中工资高于allen的员工信息SELECT sal FROM empWHERE ename = 'ALLEN'; SELECT * FROM empWHERE sal > ...
- SQLite基础-6.运算符
目录 SQLite 运算符 1. 运算符 2. 算数运算符 3. 比较运算符 4. 逻辑运算符 SQLite 运算符 1. 运算符 首先,问大家运算符是什么?运算符在很多领域均用使用.它也分很多中,常 ...
- win7安装mongodb3.6
1. 下载 https://www.mongodb.com/download-center/enterprise 选择合适平台点击下载 2. 安装mongodb 在win7系统安装mongodb需要v ...
- hadoop-InputFormat-Split-任务并行度
首先来看 MapReduce 流程图 一个 map,一个 reduce,中间靠 shuffle 连接,shuffle 左边被划分到 map,右边被划分到 reduce InputFormat inpu ...
- CNN网络结点计算总结(1998)
图 来源:Gradient-Based Learning Applied to Document Recognition 参阅CSDN:https://blog.csdn.net/dcxhun3/ar ...
- CAS实现逻辑(JWT)
由于没有获取正规做CAS的流程,这里根据网上的资料,写了一个自己觉得还可以的方案流程,留着备用 名称介绍: token:用于验证请求是否合法 refreshToken:当token失效后,客户端发送t ...