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极 ...
随机推荐
- Java程序设计基础笔记 • 【第7章 Java中的类和对象】
全部章节 >>>> 本章目录 7.1 理解类和对象 7.1.1 对象 7.1.2 抽象与类 7.1.3 类与对象的关系: 7.2 Java中的类和对象 7.2.1 类的定义 ...
- Python学习笔记:利用pd.get_dummies实现哑变量编码
一.理论介绍 虚拟变量(dummy variable)也叫哑变量,是一种将多分类变量转换为二分变量的一种形式. 如果多分类变量有k个类别,则可以转化为k-1个二分变量. 需要有一个参照的类别. 在非线 ...
- XML解析的四种方式
1.说明 XML是EXtensible Markup Language, 即可扩展标记语言, 是一种通用的数据交换格式, 它的平台无关性.语言无关性.系统无关性, 给数据集成与交互带来了极大的方便. ...
- windows环境下node安装教程(超详细)
安装node.js 1.下载node: 下载地址:http://nodejs.cn/download/ node.js的zip包安装时是直接解压缩后就可以了, node.js的msi包是傻瓜式一路ne ...
- mongodb用户权限管理的CRUD
https://blog.csdn.net/weixin_34332905/article/details/88759759?utm_medium=distribute.pc_relevant.non ...
- java 访问 太平洋网ip接口,解决前端js 跨域访问失败问题
前端 js访问太平洋网IP接口地址,返回结果是403 服务器拒绝处理异常, 于是,想到了使用 服务器端访问,然后再将查询结果返回的前端 这是Java的测试源码,[具体的contronller端源码懒得 ...
- wget 工具使用
wget http://xxxx 下载文件到当前文件夹 wget -V 显示wget的版本信息并退出 wget -v 打印详细信息 默认 wget -nv 关闭详细输出,但不进入安静模式 wget - ...
- 基于CentOS6.5-Hadoop2.7.3-hive-2.1.1安装sqoop1.4.7
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627736198431375879/ 系统版本,Hadoop已安装完成.链接<CentOS6.5下安装Had ...
- python+selenium 定位元素的主要方法
selenium对web各元素的操作首先就要先定位元素,定位元素的方法主要有以下几种: 通过id定位元素:find_element_by_id("id_vaule") 通过name ...
- go语言 strconv.ParseInt 的实现分析
字符串与数值之间进行转换是一个高频操作,在go语言中,SDK提供 strconv.ParseInt 将字符串转换为数值,strconv.FormatInt 可以将数值转换为字符串. 1.首先看下 st ...