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的简单使用的更多相关文章

  1. 多线程(三) java中线程的简单使用

    java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依 ...

  2. java中数据流的简单介绍

    java中的I/O操作主要是基于数据流进行操作的,数据流表示了字符或者字节的流动序列. java.io是数据流操作的主要软件包 java.nio是对块传输进行的支持 数据流基本概念 “流是磁盘或其它外 ...

  3. java中volatile的简单理解

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...

  4. 关于JAVA中异常处理的简单阐释.

    ---恢复内容开始--- 这是我的一篇要在博客园发布的随笔,主要是简单的概括一下我本次所学的关于异常处理的知识.有讲的不妥当的地方,或者有需要补充的,还请各位高人给指点,共同学习,虚心求学.谢谢啦~ ...

  5. redis学习笔记(二)——java中jedis的简单使用

    redis怎么在java中使用,那就是要用到jedis了,jedis是redis的java版本的客户端实现,原本原本想上来就直接学spring整合redis的,但是一口吃个胖子,还是脚踏实地,从基础开 ...

  6. Java 中的instanceof简单讲解

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  7. JAVA中JNI的简单使用

    了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式.JAVA通过 ...

  8. java中接口的简单运用&java中的一些异常(运用myeclipse)

    package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...

  9. java中序列化的简单认识

    一.什么是序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,就可 ...

随机推荐

  1. 安装yum仓库

    1.yum仓库是在系统镜像文件里,所以我们要安装yum仓库要把系统镜像文件添加进来: 2.进行挂载配置,并且要使配置永久生效,要进行配置: 3.接下来要创建yum仓库 配置文件: 总结:以上就是安装y ...

  2. Kalibr installation tutorial

    How to install Kalibr I was confused about installing Kalibr, but there is no even one hint in READM ...

  3. 将整个文件读入string中

    size_t GetFileSize(FILE* file) { fseek(file, , SEEK_END); return static_cast<size_t>(ftell(fil ...

  4. python爬虫学习心得

    作为一名python的忠实爱好者,我开始接触爬虫是在2017年4月份,最开始接触它的时候遇到两个梗,一个是对python还不算太了解(当然现在也仍然在努力学习它的有关内容),二是对爬虫心怀一份敬畏之心 ...

  5. 题目1022:游船出租(hash简单应用)

    问题来源 http://ac.jobdu.com/problem.php?pid=1022 问题描述 每次输入:船号(1~100) 键值(S或E) 发生时间(小时:分钟).当船号为0时,代表一天结束: ...

  6. Saiku2.6 保存查询后,重新打开报 Error Loading Query错误。

    发现Saiku2.6的查询保存后重新打开就会报如下错误,同等的Schema文件和数据库环境在3.15环境里面打开是一切正常的. 后面对比了一下2.6和3.15的启动环境,发现有些差异的地方. 2.6启 ...

  7. php图像处理函数image_type_to_extension、image_type_to_mime_type 的区别

    php中获得图像类型的两个函数image_type_to_extension.image_type_to_mime_type,做图像处理的时候一直不清楚这俩个函数有什么区别,今天特意查了一下,有了一些 ...

  8. bzoj2938 poi病毒 AC自动机

    题目传送门 思路: 要求构建一个字符串,使得这个字符串不包含给出的任意一个单词. 如果我们已经构建出了一个安全代码,放在ac自动机上跑,那么我们必定不能得到任何一个字符串,此时我们得到的fail指针必 ...

  9. DFS-20190206

    找出所有方案 排列和组合问题 排列: https://www.lintcode.com/problem/combination-sum/description public class Solutio ...

  10. vue中npm run dev 不能自动打开浏览器运行项目

    最近用vue2.0 + webpack搭建了环境创建新的项目.出现一个很蹩脚的问题: 在终端输入 npm run dev 的时候,不能自动打开浏览器运行项目. 这段话的意思是:你的应用程序运行地址是: ...