java并发队列
阻塞队列
常见的阻塞队列有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并发队列的更多相关文章
- 解读 java 并发队列 BlockingQueue
点击添加图片描述(最多60个字)编辑 今天呢!灯塔君跟大家讲: 解读 java 并发队列 BlockingQueue 最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括 ...
- 10分钟搞定 Java 并发队列好吗?好的
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...
- Java并发队列与容器
[前言:无论是大数据从业人员还是Java从业人员,掌握Java高并发和多线程是必备技能之一.本文主要阐述Java并发包下的阻塞队列和并发容器,其实研读过大数据相关技术如Spark.Storm等源码的, ...
- 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析
LinkedBlockingQueue 在看源码之前,通过查询API发现对LinkedBlockingQueue特点的简单介绍: 1.LinkedBlockingQueue是一个由链表实现的有界队列阻 ...
- Java 并发队列 BlockingQueue
BlockingQueue 开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 首先,最基本的来说, BlockingQueue 是一个先进先出的队列(Queue),为什么说是 ...
- 并发编程(八)—— Java 并发队列 BlockingQueue 实现之 ArrayBlockingQueue 源码分析
开篇先介绍下 BlockingQueue 这个接口的规则,后面再看其实现. 阻塞队列概要 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列的阻塞 ...
- 并发编程(十)—— Java 并发队列 BlockingQueue 实现之 SynchronousQueue源码分析
BlockingQueue 实现之 SynchronousQueue SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除 ...
- Java并发(十八):阻塞队列BlockingQueue
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ...
- Java并发指南11:解读 Java 阻塞队列 BlockingQueue
解读 Java 并发队列 BlockingQueue 转自:https://javadoop.com/post/java-concurrent-queue 最近得空,想写篇文章好好说说 java 线程 ...
随机推荐
- 「NOIP2013」货车运输
传送门 Luogu 解题思路 首先 \(\text{Kruskal}\) 一下,构造出一棵森林. 并查集还要用来判断连通性. 倍增 \(\text{LCA}\) 的时候顺便维护一下路径最小值即可. 细 ...
- 顾家办公两不误,容智ibot帮你实现高效居家办公
春节假期结束,大部分企业已陆续开始复工.经调查显示,受新型冠状病毒疫情影响,不少企业开放了员工“在家办公“模式,就此,员工被动“SOHO”,在家办公火了. 2020 在家办公靠谱吗?会不会成为未来的趋 ...
- JDBC通过资源文件初始化
- Unity2018编辑器脚本趟坑记录
解除预制体问题:(这个例子是解除游戏中的Canvas与Asset中的预制体的关系) if( PrefabUtility.IsAnyPrefabInstanceRoot(GameObject.Find( ...
- eclipse修改工作空间编码格式
一.修改workspace默认编码 eclipse打开window -> 打开preferences 二.修改jsp默认编码 eclipse打开window -> 打开preference ...
- 工业现场总线和工业以太网和工业IIOT
IIoT 称为工业物联网 ,包括机器的预测性维护和生产单元的自动化控制.以更高的速度获取和访问更大量的数据,打破数据孤岛,并将所有人员,数据和流程从工厂车间连接到执行办公室.企业领导者可以使用 IIo ...
- springMVC 的拦截器理解
请复制以下链接看,我只是搬运工 http://blog.csdn.net/yerenyuan_pku/article/details/72567761 http://blog.csdn.net/u01 ...
- zip 多维
ll=zip([[1,3],[2,4]],[[88,99],[66,55]])a=zip(*ll)# print(list(a)) #[([1, 3], [2, 4]), ([88, 99], [66 ...
- NET站点升级后,新特新无法编译通过
NET3.5 webconfig中有自动配置如下代码,用于指示编译器. <system.codedom> <compilers> <compiler language=& ...
- lable 语句
var is = 20; loop: while(is > 10){ console.log(is); if(is % 7 == 0){ break loop; } is --; } 结果: b ...