JAVA中LinkedLockingQueue的简单使用
1.相关知识的了解
阻塞队列:当队列为空时,去队列中取数据会被阻塞。当队列满时,往队列中放数据会被阻塞。
非阻塞队列:当队列为空时,去队列取数据会直接返回失败,队列满时,往队列中放数据会直接返回失败。
2.常用的阻塞队列
LinkedBlockingQueue:基于链表实现的FIFO的阻塞队列,创建是可以指定容量大小,不指定则是默认值Integer.MAX_VALUE。
ArrayBlockingQueue:基于数组实现的FIFO的阻塞队列,再创建是必须指定大小
3.LinkedBlockingQueue阻塞队列模拟生产者-消费者模式
1 package com.test; 2 3 import java.util.concurrent.BlockingQueue; 4 import java.util.concurrent.LinkedBlockingQueue; 5 import java.util.concurrent.TimeUnit; 6 import java.util.concurrent.atomic.AtomicInteger; 7 8 /** 9 * 10 * @Title: Test01.java 11 * @Package com.test 12 * @Description: 使用并发包下 LinkedBlockingQueue 阻塞队列模拟生产者消费者问题 13 * @author Mr.Chen 14 * @date 2019年4月9日 15 * @version V1.0 16 * 版权声明:本文为博主原创文章,转载请附上博文链接 17 */ 18 public class Test01 { 19 public static void main(String[] args) { 20 BlockingQueue<String> blockingQueue = new LinkedBlockingQueue<>(3); 21 ProducerThread producerThread = new ProducerThread(blockingQueue); 22 ConsumerThread consumerThread = new ConsumerThread(blockingQueue); 23 Thread t1 = new Thread(producerThread); 24 Thread t2 = new Thread(consumerThread); 25 t1.start(); 26 t2.start(); 27 //10秒后 停止线程.. 28 try { 29 Thread.sleep(10*1000); 30 producerThread.stop(); 31 } catch (Exception e) { 32 // TODO: handle exception 33 } 34 35 } 36 } 37 38 /** 39 * 40 *生存者类 41 */ 42 class ProducerThread implements Runnable { 43 //定义变量接收LinkedBlockingQueue 44 BlockingQueue<String> queue = null; 45 46 //定义一个自增的变量,用来作为队列里面的消息 47 AtomicInteger data = new AtomicInteger(0); 48 49 //定义循环的结束条件 50 boolean flag = true; 51 52 public ProducerThread(BlockingQueue<String> queue) { 53 this.queue = queue; 54 } 55 56 @Override 57 public void run() { 58 try { 59 //循环往队列里面放值,如果放不进去,设置两秒的等待时间。每个循环设置1秒的等待时间,以便打印的时候方便查看 60 System.out.println(Thread.currentThread().getName() + " 生产者启动-----"); 61 while (flag) { 62 //获取data自增的值 63 String message = data.incrementAndGet() + ""; 64 boolean offer = queue.offer(message, 2, TimeUnit.SECONDS); 65 if (offer) { 66 System.out.println(Thread.currentThread().getName() + " " + message + " 放入队列成功"); 67 } else { 68 System.out.println(Thread.currentThread().getName() + " " + message + " 放入队列失败"); 69 } 70 Thread.sleep(1000); 71 } 72 } catch (InterruptedException e) { 73 System.out.println(Thread.currentThread().getName() + " 生产者停止-----"); 74 } finally { 75 System.out.println(Thread.currentThread().getName() + " 生产者停止-----"); 76 } 77 } 78 79 80 public void stop() { 81 this.flag = false; 82 } 83 84 } 85 86 class ConsumerThread implements Runnable { 87 //定义变量接收LinkedBlockingQueue 88 BlockingQueue<String> queue = null; 89 90 //定义循环的结束条件 91 boolean flag = true; 92 93 public ConsumerThread(BlockingQueue<String> queue) { 94 this.queue = queue; 95 } 96 97 @Override 98 public void run() { 99 //使用queue 去取队列中的消息 100 System.out.println(Thread.currentThread().getName() + " 消费者启动-----"); 101 try { 102 while (flag) { 103 String poll = queue.poll(2, TimeUnit.SECONDS); 104 if (poll == null) { 105 flag = false; 106 System.out.println("消费者超过2秒时间未获取到消息."); 107 return; 108 } 109 System.out.println(Thread.currentThread().getName() + " 消费者拿到 " + poll ); 110 Thread.sleep(2000); 111 } 112 } catch (InterruptedException e) { 113 // TODO Auto-generated catch block 114 e.printStackTrace(); 115 } 116 117 } 118 119 }
转载于:https://www.cnblogs.com/chenfei-java/p/10680264.html
JAVA中LinkedLockingQueue的简单使用相关推荐
- Java中的GC简单介绍
文章目录 一.GC是什么? 二.为什么要GC? 三.怎么GC? 一.GC是什么? GC英文全称为Garbage Collection,即垃圾回收. Java中的GC就是对内存的GC. Java的内存管 ...
- Java 中 10 大简单的性能优化
点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! Java 7 ForkJoinPool和 Java 8 的并行Stream有助于并行化东西,这在您将 Java 程 ...
- java中的List简单介绍
List是Java中比较常用的集合类,关于List接口有很多实现类,本文就来简单介绍下其中几个重点的实现ArrayList.LinkedList和Vector之间的关系和区别. List 是一个接口, ...
- 在Java中搭建一个简单的MVC框架
搭建一个简单的Java MVC框架 一 . 前言 二. 代码实现 1. 思路分析 2. 代码实现 2.1 Controller注解 2.2 RequestMapping注解 2.3 UserContr ...
- Java中UUID的简单介绍
一.什么是UUID? UUID全称:Universally Unique Identifier,即通用唯一识别码. UUID是由一组32位数的16进制数字所构成,UUID的标准型式包含32个16进制数 ...
- java中Scanner的简单用法
一.用法 1.先导入Java.util.Scanner包 import java.util.Scanner; 2.创建Scanner类的对象 Scanner sc=new Scanner(System ...
- java中split方法 简单详细
java中split方法 思考下列代码的执行结果 public static void main(String[] args) {// TODO Auto-generated method stubS ...
- java中创建dvd_JAVA简单模拟DVD功能
建立数组1. public class DVD_set { 2. //此处为copy 3. String[] name = new String[50];// 存储DVD的名字 4. String[] ...
- java中String.split() 简单学习
在java.lang包中有String.split()方法的原型是: public String[] split(String regex, int limit) split函数是用于使用特定的切割符 ...
最新文章
- Python中的注释
- 老司机带你重构Android的v4包的部分源码
- 大数据分析苏轼,你没看错,这些都是小学生完成的
- 【日期类问题】例2.1日期差值
- 配置php apache,apache如何配置php
- shell学习☞shell工具
- 微软私有云部署及讲解专题
- 开源免费CRM云端的客户管理系统SuiteCRM简介
- 微信公众号音频在线下载工具 微信公众号音频下载工具 微信公众号视频下载工具
- Unity爆炸、闪电、火焰、雷雨特效Demo
- 朱乐睿_校友风采_师范大学企业管理专业
- 2021年4月程序员工资统计排行
- C# 基础(三十一)c#实现 正弦sin、反正弦arcsin,正切tan、反正切arctan:求角度值
- 【华为OJ】【MML命令执行结果查询】
- Windows10 桌面不停的闪烁问题
- OTT发展背后的融合通讯
- fgets()函数的使用分析
- ubuntu 20.04 调节屏幕亮度
- HTML_圣斗士星矢界面
- 安装配置CA激活NSX-T证书
热门文章
- 服务端关闭session的重要性
- POJ 2104 K-th Number
- ansible学习笔记
- 同时给两个变量值赋值
- 【LeetCode】55.跳跃游戏
- android ios 上传图片到服务器,.net 接收ios, android的上传图片
- php模拟getua_php实现进行远程抓取百度网页内容,并伪装服务器端ip
- php把中文写入mysql_PHP向mysql插入中文乱码问题,php文件内容写入数据库!
- 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普
- 2.安装Ubuntu系统时,系统时间显示不对