Java线程--BlockingQueue使用
- 原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html
Java线程--BlockingQueue使用
阻塞队列就是内容满了之后, 就开始阻塞, 直到有消费者消费了东西之后才又开始生产, 看代码:
- package concurrent.blockingqueue;
- import java.util.concurrent.BlockingQueue;
- import java.util.concurrent.atomic.AtomicInteger;
- /**
- * 生产者
- */
- public class Producer implements Runnable {
- /**
- * 计数器
- */
- private static AtomicInteger k = new AtomicInteger(0);
- BlockingQueue queue;
- public Producer(BlockingQueue queue) {
- this.queue = queue;
- }
- @Override
- public void run() {
- while (true) {
- try {
- /**
- * 把生产出来的东西丢进队列中去
- */
- queue.put(produce());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 生产东西, 然后返回出去
- * @return
- * @throws InterruptedException
- */
- private AtomicInteger produce() throws InterruptedException {
- k.addAndGet(1);
- System.out.println("生产者开始生产东西了... " + k);
- return k;
- }
- }
- package concurrent.blockingqueue;
- import java.util.concurrent.BlockingQueue;
- /**
- * 消费者
- */
- public class Consumer implements Runnable {
- BlockingQueue queue;
- public Consumer(BlockingQueue queue){
- this.queue = queue;
- }
- @Override
- public void run() {
- while (true) {
- try {
- /**
- * 延迟3秒再从队列中取出,
- * 这样就可以看到生产队列生产满了之后就停止生产,
- * 直到消费者消费了之后再继续生产
- */
- Thread.sleep(3000);
- consume(queue.take());
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 消费东西
- * @param o
- */
- void consume(Object o){
- System.out.println("消费者开始消费东西了.... " + o);
- }
- }
- package concurrent.blockingqueue;
- import java.util.concurrent.ArrayBlockingQueue;
- import java.util.concurrent.BlockingQueue;
- /**
- * main 测试类
- */
- public class MainTest {
- public static void main(String[] args) {
- /**
- * 搞一个阻塞队列容量为3, 当超过容量就开始堵塞
- */
- BlockingQueue queue = new ArrayBlockingQueue(3);
- new Thread(new Producer(queue)).start();
- new Thread(new Consumer(queue)).start();
- }
- }
看打印结果:
- 生产者开始生产东西了... 1
- 生产者开始生产东西了... 2
- 生产者开始生产东西了... 3
- 生产者开始生产东西了... 4
- 消费者开始消费东西了.... 4
- 生产者开始生产东西了... 5
- 消费者开始消费东西了.... 5
- 生产者开始生产东西了... 6
- 消费者开始消费东西了.... 6
- 生产者开始生产东西了... 7
- 消费者开始消费东西了.... 7
- 生产者开始生产东西了... 8
- 消费者开始消费东西了.... 8
- 生产者开始生产东西了... 9
- 消费者开始消费东西了.... 9
- 生产者开始生产东西了... 10
这个结果很明显了.
Java线程--BlockingQueue使用的更多相关文章
- Java线程和多线程(十一)——BlockingQueue
这次讨论的是Java的BlockingQueue,java.util.concurrent.BlockingQueue是一个Java的队列接口,支持一系列操作,比如,在获取和移除对象的时候如果队列为空 ...
- 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构 ...
- java线程(7)——阻塞队列BlockingQueue
回顾: 阻塞队列,英文名叫BlockingQueue.首先他是一种队列,联系之前Java基础--集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了.来看一下他们的接口 ...
- JAVA线程队列BlockingQueue
JAVA线程队列BlockingQueue 介绍 BlockingQueue阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出. 常用的队列主要有以 ...
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- Java线程新特征——Java并发库
一.线程池 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...
- Java线程池使用说明
Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...
随机推荐
- Windows下SQL Server数据库的安装
由于工作需要出一版教程,记录一下安装过程,用到的数据库是SQL Server2014版本 下载地址为:SQL Server2014下载 提取码:6666 下载好安装包,首先右键,装载 装载完, 会有这 ...
- Kerberos加密级别不支持的问题
1.问题现象 Zookeeper开启kerberos认证后出现如下问题,不支持的加密级别: 2017-02-23 09:20:57,048 [myid:1] - WARN [NIOWorkerThre ...
- 初识python: 斐波拉契数(生成器获取)
使用 生成器(yield) 获取斐波拉契数. 代码如下: def fun(n): a,b,c = 0,0,1 while a < n: yield b # b, c = c, b + c 以下 ...
- 在使用django admin的后台搜索时报错
在使用django admin的后台搜索时报错 百度说在search_fields中定义了非字符串字段,最后发现author引用了外键 解决办法: 有外健时应写成: 本表外键字段__外键所在表所需要查 ...
- Go语言发邮件
发送邮件是实际业务中经常会用到的一个功能,而在Go语言中实现发送邮件的库也有很多,这篇文章将介绍go语言中如何发邮件. 1. 登录QQ邮箱,选择账户,开启POP3/SMTP服务和IMAP/SMTP服务 ...
- LINUX学习-Mysql集群-一主多从
新建一台服务器 192.168.88.40 yum -y install mysql mysql-server 编辑etc下的配置文件 vim /etc/my.cnf 输入 bin-log=mysql ...
- vuex获取数据
cmd窗口vue add vuex后出现store文件夹,在里面的index.js里面设置state属性,可以在视图页面home.vue文件中获取. 方法1: //在项目当中引入router以后 就多 ...
- 移动Web开发实践——解决position:fixed自适应BUG
在移动web中使用position:fixed,会踩到很多坑,在我之前的一篇文章<移动端web页面使用position:fixed问题总结>中已经总结了很多bug,但是在后续的开发中有关f ...
- 开启mysql外部访问(root外连)
MySQL外部访问 mysql 默认是禁止远程连接的,你在安装mysql的系统行运行mysql -u root -p 后进入mysql 输入如下: mysql>use mysql; mysql& ...
- USB Tethering always displays grey when USB tethering type is Linux(EEM)
USB Tethering always displays grey when USB tethering type is Linux(EEM) 1.Problem DESCRIPTION USB T ...