JAVA中LinkedLockingQueue的简单使用
1.相关知识的了解
阻塞队列:当队列为空时,去队列中取数据会被阻塞。当队列满时,往队列中放数据会被阻塞。
非阻塞队列:当队列为空时,去队列取数据会直接返回失败,队列满时,往队列中放数据会直接返回失败。
2.常用的阻塞队列
LinkedBlockingQueue:基于链表实现的FIFO的阻塞队列,创建是可以指定容量大小,不指定则是默认值Integer.MAX_VALUE。
ArrayBlockingQueue:基于数组实现的FIFO的阻塞队列,再创建是必须指定大小
3.LinkedBlockingQueue阻塞队列模拟生产者-消费者模式
package com.test; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; /**
*
* @Title: Test01.java
* @Package com.test
* @Description: 使用并发包下 LinkedBlockingQueue 阻塞队列模拟生产者消费者问题
* @author Mr.Chen
* @date 2019年4月9日
* @version V1.0
* 版权声明:本文为博主原创文章,转载请附上博文链接
*/
public class Test01 {
public static void main(String[] args) {
BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(3);
ProducerThread producerThread = new ProducerThread(blockingQueue);
ConsumerThread consumerThread = new ConsumerThread(blockingQueue);
Thread t1 = new Thread(producerThread);
Thread t2 = new Thread(consumerThread);
t1.start();
t2.start();
//10秒后 停止线程..
try {
Thread.sleep(10*1000);
producerThread.stop();
} catch (Exception e) {
// TODO: handle exception
} }
} /**
*
*生存者类
*/
class ProducerThread implements Runnable {
//定义变量接收LinkedBlockingQueue
BlockingQueue<String> queue = null; //定义一个自增的变量,用来作为队列里面的消息
AtomicInteger data = new AtomicInteger(0); //定义循环的结束条件
boolean flag = true; public ProducerThread(BlockingQueue<String> queue) {
this.queue = queue;
} @Override
public void run() {
try {
//循环往队列里面放值,如果放不进去,设置两秒的等待时间。每个循环设置1秒的等待时间,以便打印的时候方便查看
System.out.println(Thread.currentThread().getName() + " 生产者启动-----");
while (flag) {
//获取data自增的值
String message = data.incrementAndGet() + "";
boolean offer = queue.offer(message, 2, TimeUnit.SECONDS);
if (offer) {
System.out.println(Thread.currentThread().getName() + " " + message + " 放入队列成功");
} else {
System.out.println(Thread.currentThread().getName() + " " + message + " 放入队列失败");
}
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " 生产者停止-----");
} finally {
System.out.println(Thread.currentThread().getName() + " 生产者停止-----");
}
} public void stop() {
this.flag = false;
} } class ConsumerThread implements Runnable {
//定义变量接收LinkedBlockingQueue
BlockingQueue<String> queue = null; //定义循环的结束条件
boolean flag = true; public ConsumerThread(BlockingQueue<String> queue) {
this.queue = queue;
} @Override
public void run() {
//使用queue 去取队列中的消息
System.out.println(Thread.currentThread().getName() + " 消费者启动-----");
try {
while (flag) {
String poll = queue.poll(2, TimeUnit.SECONDS);
if (poll == null) {
flag = false;
System.out.println("消费者超过2秒时间未获取到消息.");
return;
}
System.out.println(Thread.currentThread().getName() + " 消费者拿到 " + poll );
Thread.sleep(2000);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
JAVA中LinkedLockingQueue的简单使用的更多相关文章
- 多线程(三) java中线程的简单使用
java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依 ...
- java中数据流的简单介绍
java中的I/O操作主要是基于数据流进行操作的,数据流表示了字符或者字节的流动序列. java.io是数据流操作的主要软件包 java.nio是对块传输进行的支持 数据流基本概念 “流是磁盘或其它外 ...
- java中volatile的简单理解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...
- 关于JAVA中异常处理的简单阐释.
---恢复内容开始--- 这是我的一篇要在博客园发布的随笔,主要是简单的概括一下我本次所学的关于异常处理的知识.有讲的不妥当的地方,或者有需要补充的,还请各位高人给指点,共同学习,虚心求学.谢谢啦~ ...
- redis学习笔记(二)——java中jedis的简单使用
redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...
- Java 中的instanceof简单讲解
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...
- JAVA中JNI的简单使用
了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式.JAVA通过 ...
- java中接口的简单运用&java中的一些异常(运用myeclipse)
package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...
- java中序列化的简单认识
一.什么是序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可 ...
随机推荐
- CF666E Forensic Examination(后缀自动机+动态线段树)
题意 给你一个串 $S$ 以及一个字符串数组 $T[1..m]$ , $q$ 次询问,每次问 $S$ 的子串 $S[p_l..p_r]$ 在 $T[l..r]$ 中的哪个串里的出现次数最多,并输出出现 ...
- 阿里java开发规范学习(附P3C IDEA插件 帮助规范的养成)
浅析 阿里巴巴 Java 开发规约 (未完成) 更加优秀的页面展现请到浅析 阿里巴巴 Java 开发规约 contents 为什么要学 编程规约 P3C IDEA 插件 why-use 我们知道,一般 ...
- luogu4383 [八省联考2018]林克卡特树(带权二分+dp)
link 题目大意:给定你 n 个点的一棵树 (边有边权,边权有正负) 你需要移除 k 条边,并连接 k 条权值为 0 的边,使得连接之后树的直径最大 题解: 根据 [POI2015]MOD 那道题, ...
- [转载]Flip an image in UIImageView using UIView transitionWithView
View animations on the iPhone are wonderful. Used properly they will delight your users and help you ...
- 【Alpha】Scrum Meeting 0&1
前言 第0次会议和第1次会议分别在4月1日和4月2日21:00由PM在大运村一公寓3层召开. 第0次时长50min,主要明确了接下来的任务,对工作进行了分配. 第1次会议时长20min,调研了当日工作 ...
- 认识CSS中盒子模型
前端之HTML,CSS(六) CSS 盒子模型 CSS中的重点,理解盒子模型对于CSS才能有更清晰的认识.网页说简单一点其实就是一块一块的拼接出来的,可以想象成拼图,所有图块拼接在一起就成了一幅图像. ...
- lua-nginx-module模块常用命令
ngx.location.capture 用法: local res = ngx.location.capture(uri, options) 发起一个同步非阻塞的nginx子请求,uri是inter ...
- RabbitMQ的TopicExchange通配符问题
TopicExchange交换机支持使用通配符*.# *号只能向后多匹配一层路径. #号可以向后匹配多层路径.
- flow类型检查
https://blog.csdn.net/tangxiujiang/article/details/80778627 Flow的简单介绍 2018年06月22日 21:54:25 tangxiuji ...
- (转)最新版 nginx内置变量 大全
原文:http://www.cnphp.info/nginx-embedded-variables-lasted-version.html 在配置基于nginx服务器的网站时,必然会用到 nginx内 ...