并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue
LinkedBlockingQueue是一个基于链表的阻塞队列。
由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选。
LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE。
此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。
新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,
它实现了BlockingQueue接口。
其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。
作为开发者,我们需要注意的是,如果构造一个LinkedBlockingQueue对象,而没有指定其容量大小,LinkedBlockingQueue会默认一个类似无限大小的容量(Integer.MAX_VALUE),这样的话,如果生产者的速度一旦大于消费者的速度,也许还没有等到队列满阻塞产生,系统内存就有可能已被消耗殆尽了。
具体代码如下:
/**
* 生产者
*/
public class Producer extends Thread{
private LinkedBlockingQueue<Object> linkedBlockingQueue;
public Producer(LinkedBlockingQueue<Object> linkedBlockingQueue){
this.linkedBlockingQueue = linkedBlockingQueue;
} @Override
public void run() {
int i = 0;
while(i<12){
try {
System.out.println("currentThead:"+Thread.currentThread().getName()+".producer:"+i);
linkedBlockingQueue.put(new Info(i));
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
}
}
import java.util.concurrent.LinkedBlockingQueue; /**
* 消费者
*/
public class Consumer extends Thread{
private LinkedBlockingQueue<Info> linkedBlockingQueue;
public Consumer(LinkedBlockingQueue<Info> linkedBlockingQueue){
this.linkedBlockingQueue = linkedBlockingQueue;
} @Override
public void run() {
while(true){
try {
Info obj = linkedBlockingQueue.take();
System.out.println("consumer:"+obj.getI());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Info {
private int i;
public Info(int i){
this.i = i;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
/**
* LinkedBlockingQueue 多用于任务队列
* 适合 单生产者,单消费者
* 多生产者,单消费者
* ConcurrentLinkedQueue 多用于消息队列
* 适合 单生产者 ,多消费者
* 多生产者 ,多消费者
*
*/
public class Main {
public static void main(String[] args) {
//声明队列:队列中只允许最多10条数据,超过等待执行
LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue(10); //三个生产者
Producer producer1 = new Producer(linkedBlockingQueue);
producer1.start();
Producer producer2= new Producer(linkedBlockingQueue);
producer2.start();
Producer producer3= new Producer(linkedBlockingQueue);
producer3.start(); //一个消费者
Consumer consumer = new Consumer(linkedBlockingQueue);
consumer.start();
}
}
源码地址:https://github.com/qjm201000/concurrent_linkedBlockingQueue.git
并发编程-concurrent指南-阻塞队列-链表阻塞队列LinkedBlockingQueue的更多相关文章
- 并发编程-concurrent指南-线程池ExecutorService的实例
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...
- 并发编程-concurrent指南-原子操作类-AtomicInteger
在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger
- 并发编程-concurrent指南-阻塞双端队列-链阻塞双端队列LinkedBlockingDeque
LinkedBlockingDeque是双向链表实现的阻塞队列.该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除): 在不能够插入元素时,它将阻塞住试图插入元 ...
- 并发编程-concurrent指南-阻塞队列BlockingQueue
阻塞队列BlockingQueue,java.util.concurrent下的BlockingQueue接口表示一个线程放入和提取实例的队列. 适用场景: BlockingQueue通常用于一个线程 ...
- 并发编程-concurrent指南-阻塞双端队列BlockingDeque
java.util.concurrent 包里的 BlockingDeque 接口表示一个线程安放入和提取实例的双端队列. BlockingDeque 类是一个双端队列,在不能够插入元素时,它将阻塞住 ...
- 并发编程-concurrent指南-阻塞队列-优先级的阻塞队列PriorityBlockingQueue
PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插 ...
- 并发编程-concurrent指南-阻塞队列-数组阻塞队列ArrayBlockingQueue
ArrayBlockingQueue类是实现了BlockingQueue. ArrayBlockingQueue是一个有界的阻塞队列,其内部实现是将对象放在一个数组中. 放入元素方法: (1) add ...
- 并发编程-concurrent指南-阻塞队列-同步队列SynchronousQueue
SynchronousQueue:同步Queue,属于线程安全的BlockingQueue的一种,此队列设计的理念类似于"单工模式",对于每个put/offer操作,必须等待一个t ...
- 并发编程-concurrent指南-阻塞队列-延迟队列DelayQueue
DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不能 ...
随机推荐
- apt-spy 软件源更新
ebian上的apt-get是最快的软件安装方式,不过要用好apt-get,首先得需要找到最快的源,这样安装软件的时候才能获得好的速度,用起来才能得心应手. 有的源在用了一段以后,就会失效,这个时候, ...
- WPF listview item mouse enter/over popup
This is because the routing strategy of the Loaded event is Direct, which means that the routed even ...
- 【转载】MySQL和Keepalived高可用双主复制
服务器主机IP和虚拟浮动IP配置 RealServer A 192.168.75.133 RealServer B 192.168.75.134 VIP A 192.168.75.110 VIP B ...
- 从PRISM开始学WPF(八)导航Navigation?
原文:从PRISM开始学WPF(八)导航Navigation? 0x6Navigation Basic Navigation Prism中的Navigation提供了一种类似导航的功能,他可以根据用户 ...
- KEIL MDK编译后的代码量和RAM使用详解
一般 MCU 包含的存储空间有:片内 Flash 与片内 RAM,RAM 相当于内存,Flash 相当于硬盘.编译器会将一个程序分为好几个部分,分别存储在 MCU 不同的存储区.Keil 工程在编译完 ...
- miniui autocomplete支持放大镜按钮(data-grid)
<style type="text/css"> html body .searchbox .mini-buttonedit-close { background:url ...
- sqlserver从xlsx读取数据
exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Querie ...
- WPF判断两个PNG图片是否碰撞
这个方法有几个前提 1.两个Image必须在一个Canvas中 2.两个Image的Canvas.Top和Canvas.Left必须赋值 上一篇讲了判断一个PNG图片某个点是否透明 这个基本类似的方法 ...
- 财富500强的前10个公司里有8个公司在使用Qt(Qt自己认为的优点是:直觉主义、跨平台、节省时间),以及一些商业案例
8 of Top 10 Fortune 500 use Qt Qt is the software development framework of choice by engineers in ov ...
- 不要困在自己建造的盒子里——写给.NET程序员(附精彩评论)
此文章的主旨是希望过于专注.NET程序员在做好工作.写好.NET程序的同时,能分拨出一点时间接触一下.NET之外的东西(例如10%-20%的时间),而不是鼓动大家什么都去学最后什么都学不精,更不是说. ...