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的简单使用相关推荐

  1. Java中的GC简单介绍

    文章目录 一.GC是什么? 二.为什么要GC? 三.怎么GC? 一.GC是什么? GC英文全称为Garbage Collection,即垃圾回收. Java中的GC就是对内存的GC. Java的内存管 ...

  2. Java 中 10 大简单的性能优化

    点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! Java 7 ForkJoinPool和 Java 8 的并行Stream有助于并行化东西,这在您将 Java 程 ...

  3. java中的List简单介绍

    List是Java中比较常用的集合类,关于List接口有很多实现类,本文就来简单介绍下其中几个重点的实现ArrayList.LinkedList和Vector之间的关系和区别. List 是一个接口, ...

  4. 在Java中搭建一个简单的MVC框架

    搭建一个简单的Java MVC框架 一 . 前言 二. 代码实现 1. 思路分析 2. 代码实现 2.1 Controller注解 2.2 RequestMapping注解 2.3 UserContr ...

  5. Java中UUID的简单介绍

    一.什么是UUID? UUID全称:Universally Unique Identifier,即通用唯一识别码. UUID是由一组32位数的16进制数字所构成,UUID的标准型式包含32个16进制数 ...

  6. java中Scanner的简单用法

    一.用法 1.先导入Java.util.Scanner包 import java.util.Scanner; 2.创建Scanner类的对象 Scanner sc=new Scanner(System ...

  7. java中split方法 简单详细

    java中split方法 思考下列代码的执行结果 public static void main(String[] args) {// TODO Auto-generated method stubS ...

  8. java中创建dvd_JAVA简单模拟DVD功能

    建立数组1. public class DVD_set { 2. //此处为copy 3. String[] name = new String[50];// 存储DVD的名字 4. String[] ...

  9. java中String.split() 简单学习

    在java.lang包中有String.split()方法的原型是: public String[] split(String regex, int limit) split函数是用于使用特定的切割符 ...

最新文章

  1. Python中的注释
  2. 老司机带你重构Android的v4包的部分源码
  3. 大数据分析苏轼,你没看错,这些都是小学生完成的
  4. 【日期类问题】例2.1日期差值
  5. 配置php apache,apache如何配置php
  6. shell学习☞shell工具
  7. 微软私有云部署及讲解专题
  8. 开源免费CRM云端的客户管理系统SuiteCRM简介
  9. 微信公众号音频在线下载工具 微信公众号音频下载工具 微信公众号视频下载工具
  10. Unity爆炸、闪电、火焰、雷雨特效Demo
  11. 朱乐睿_校友风采_师范大学企业管理专业
  12. 2021年4月程序员工资统计排行
  13. C# 基础(三十一)c#实现 正弦sin、反正弦arcsin,正切tan、反正切arctan:求角度值
  14. 【华为OJ】【MML命令执行结果查询】
  15. Windows10 桌面不停的闪烁问题
  16. OTT发展背后的融合通讯
  17. fgets()函数的使用分析
  18. ubuntu 20.04 调节屏幕亮度
  19. HTML_圣斗士星矢界面
  20. 安装配置CA激活NSX-T证书

热门文章

  1. 服务端关闭session的重要性
  2. POJ 2104 K-th Number
  3. ansible学习笔记
  4. 同时给两个变量值赋值
  5. 【LeetCode】55.跳跃游戏
  6. android ios 上传图片到服务器,.net 接收ios, android的上传图片
  7. php模拟getua_php实现进行远程抓取百度网页内容,并伪装服务器端ip
  8. php把中文写入mysql_PHP向mysql插入中文乱码问题,php文件内容写入数据库!
  9. 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普
  10. 2.安装Ubuntu系统时,系统时间显示不对