阻塞队列

常见的阻塞队列有ArrayBlockingQueue,LinkedBlockingDeque,LinkedBlockingQueue,这些队列有界且可以阻塞线程

ArrayBlockingQueue

ArrayBlockingQueue是有界的阻塞队列,LinkedBlockingDeque通过数组、非空和非满Condition、RantrantLock实现了线程安全。空的时候take阻塞,满的时候put阻塞

java并发初探LinkedBlockingQueue

LinkedBlockingQueue是有界的阻塞队列,通过head,last节点,putLock插入锁,takeLock取锁、非空和非满condition、单向链表实现了线程安全的阻塞队列,空的时候take阻塞,满的时候put阻塞

java并发初探LinkedBlockingQueue

LinkedBlockingQueue是有界的阻塞队列,通过head,last节点,putLock插入锁,takeLock取锁、非空和非满condition、单向链表实现了线程安全的阻塞队列,空的时候take阻塞,满的时候put阻塞

非阻塞队列

java并发初探ConcurrentLinkedQueue

ConcurrentLinkedQueue是线程安全的无界队列,通过volatile和CAS操作保证了线程安全。

例子

阻塞队列当满的时候put元素回阻塞,实现队列接口的LinkedList在多线程的时候会跑出ConcurrentModifExeception异常

package com.java.javabase.thread.collection;

import lombok.extern.slf4j.Slf4j;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue; /**
* @author
*/
@Slf4j
public class BlockingQueueTest {
/* public static Queue<String> queue = new ArrayBlockingQueue<String>(20);
public static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(20);
public static LinkedBlockingDeque<String> queue = new LinkedBlockingDeque<String>(20);
public static LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(20);
public static Queue<String> queue =new LinkedList<String>();
public static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
*/
public static ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(20); public static int size = 15; public static void main(String[] args) {
Thread t1 = new InnerThread("t1");
Thread t2 = new InnerThread("t2");
t1.start();
t2.start();
try {
Thread.sleep(2000);
printQueue(queue);
} catch (InterruptedException e) {
e.printStackTrace();
} } static class InnerThread extends Thread {
String name;
public InnerThread(String name) {
super(name);
this.name=name;
} @Override
public void run() {
for (int i = 0; i < size; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
String tmp=i+" "+name; //queue.add(tmp);
try {
queue.put(tmp);
//queue.add(tmp);
} catch (InterruptedException e) {
log.error("error",e);
}
printQueueNone(queue);
}
}
} public static void printQueue(Queue queue) {
Iterator iterator = queue.iterator();
while (iterator.hasNext()) {
log.info("thread {} print {}", Thread.currentThread().getName(), iterator.next());
}
}
public static void printQueueNone(Queue queue) {
Iterator iterator = queue.iterator();
while (iterator.hasNext()) {
iterator.next();
}
} }

运行结果

2019-08-28 19:42:32,684   [main] INFO  BlockingQueueTest  - thread main print 0 t1
2019-08-28 19:42:32,686 [main] INFO BlockingQueueTest - thread main print 0 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 1 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 1 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 2 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 2 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 3 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 3 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 4 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 4 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 5 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 5 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 6 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 6 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 7 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 7 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 8 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 8 t1
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 9 t2
2019-08-28 19:42:32,687 [main] INFO BlockingQueueTest - thread main print 9 t1

java并发队列的更多相关文章

  1. 解读 java 并发队列 BlockingQueue

    点击添加图片描述(最多60个字)编辑 今天呢!灯塔君跟大家讲: 解读 java 并发队列 BlockingQueue 最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括 ...

  2. 10分钟搞定 Java 并发队列好吗?好的

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  3. Java并发队列与容器

    [前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一.本文主要阐述Java并发包下的阻塞队列和并发容器,其实研读过大数据相关技术如Spark.Storm等源码的, ...

  4. 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析

    LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ...

  5. Java 并发队列 BlockingQueue

    BlockingQueue 开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 首先,最基本的来说, BlockingQueue 是一个先进先出的队列(Queue),为什么说是 ...

  6. 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析

    开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 阻塞队列概要 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列的阻塞 ...

  7. 并发编程(十)—— Java 并发队列 BlockingQueue 实现之 SynchronousQueue源码分析

    BlockingQueue 实现之 SynchronousQueue SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...

  8. Java并发(十八):阻塞队列BlockingQueue

    阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ...

  9. Java并发指南11:解读 Java 阻塞队列 BlockingQueue

    解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程 ...

随机推荐

  1. Java AQS 的胡言乱语修正版

    前言 适合读者:3 年以上经验的同学 谈到并发编程,基本上都会想到JDK 的 JUC 工具包,它包含 锁,并发工具类,原子类,线程池,还有阻塞队列,这是从网上找的一个大致的知识体系. 相信这些工具读者 ...

  2. Python:面向对象基础

    基本理论 什么是对象 万物皆对象 对象是具体的事物 拥有属性.行为 把许多零散的东西,封装成为一个整体 Python中一切东西都是对象,Python是一门特别彻底的面向对象编程语言(OOP) 其他编程 ...

  3. 【代码审计】VAuditDemo SQL注入漏洞

    这里我们定位 sqlwaf函数 在sys/lib.php中,过滤了很多关键字,但是42 43 44行可以替换为空 比如我们可以 uni||on来绕过过滤

  4. 【代码审计】MenInfo文件包含漏洞

    代码审计是我之前一直不敢涉及的领域,它包含的知识面太广.最近才开始学习,前段时间写的第一篇代码审计的文章 更多的感觉像是一个黑盒测试.我也会尽量把文章写的通俗易懂.代码审计 0基础从大牛的蜕变 从这里 ...

  5. left join 、right join 和inner join之间的区别

    SQL的left join .right join 和inner join之间的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) ...

  6. border-1px的实现(stylus)如何在移动端设置1px的border

    在这里我只介绍下边框的实现: 当样式像素一定时,因手机有320px,640px等.各自的缩放比差异,所以设备显示像素就会有1Npx,2Npx.为保设计稿还原度,解决就是用media + scale. ...

  7. 使用vASA842配置ASDM645

    准备:使用VMware打开vASA842.ova文件,将第一个网络适配器桥接到一个vmnet接口,我这里是vmnet3,网段是10.0.0.0/24,网关是10.0.0.1/24 1.打开vASA84 ...

  8. 【转】Swagger详解(SpringBoot+Swagger集成)

    Swagger-API文档接口引擎Swagger是什么 Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器 ...

  9. Java面向对象编程 -1.3

    类与对象的定义与使用 在Java之中类是一个独立的结构体,所以需要使用class来进行定义,而类之中主要由属性和方法所组成,那么属性就是一个个具体的变量,方法就是可以重复执行的代码. 定义一个类 cl ...

  10. 自定义 Laravel 5.7 - 6.X 中验证邮箱的标题文本

    原理解析: 验证邮箱在Laravel默认实现中是一个Notification,不是Mailable,而为了自定义验证邮箱的默认配置,我们先来查看一下 /vendor/laravel/framework ...