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. kvm虚拟机磁盘文件读取小结

    kvm虚拟机磁盘挂载还真不是一帆风顺的.xen虚拟化默认就raw格式的磁盘,可以直接挂载,kvm如果采用raw也可以直接挂载,与xen磁盘挂载方式一致. 1.kvm虚拟化相比xen虚拟化来说,工具与方 ...

  2. ajax的两个重要参数contentType 和dataType

    contentType 是入参!!!!!! 是传递给后端参数的格式: contentType : 'application/json;charset=UTF-8', contentType : 'te ...

  3. 爬虫--python3如何安装scrapy?

    直接使用pip3 install scrapy会报很多错误,所以试试以下步骤. (1) https://www.lfd.uci.edu/~gohlke/pythonlibs/ 在这个python第三方 ...

  4. H5新手教程,小白来看看。

    H5教程(一) 相信点进来看这篇文章的应该都是刚刚接触H5的新手,那么你真的是找到了一篇合适的文章. 1.学习前准备 既然想学习好H5,只是这样看是不够的,还需要动手练习,以及及时复习,所以我推荐几款 ...

  5. springmvc初步配置

    导包/添加依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spr ...

  6. Ionic2:创建App启动页滑动欢迎界面

    来自:https://my.oschina.net/qinphil/blog/777787 著作权归原创作者所有,如有再转,请自觉标明原创出处,以示尊重! 摘要: 每个有逼格的App在第一次启动时都有 ...

  7. leetcode-575-Distribute Candies(计算一个数组中元素的种类的快速方法)

    题目描述: Given an integer array with even length, where different numbers in this array represent diffe ...

  8. http、tcp及从请求到渲染的过程

    http.tcp及从请求到渲染的过程 https://blog.csdn.net/pambassador/article/details/88539478 http请求的结构内容 https://ww ...

  9. 前端获取指定cookie

    前端获取指定cookie的值 function getCookie(cookiename){ var name = cookiename + "="; var cs = docum ...

  10. web及时通信传输的几种方法

    有哪些: 轮询.长轮询.iframe流.websocket 轮询:http的请求有一个很明显的缺点,就是只能有客户端发起,不能由服务端主动推送,所以轮询就是定时向服务器发送请求,去获取数据 优点:传输 ...