并发编程-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接口的对象,其中的对象只能在其到期时才能从队列中取走.这种队列是有序的,即队头对象的延迟到期时间最长.注意:不能 ...
随机推荐
- WPF中的 Layout To Layout
原文:WPF中的 Layout To Layout WPF中的 Layout To Layout 周银辉 WPF的布局功能异常强大,当有时我 ...
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...
- Goutte 获取http response
$client = new Goutte\Client(); $crawler = $client->request('GET', 'http://symfony.com'); 获取http 响 ...
- 常用cl编译命令参数解释
紧接前文,第一行cl命令如下: 1> cl /c /IC:\...\include /ZI /nologo- /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG ...
- Bootstrap 添加到项目
至少在项目中添加以下三个文件 1 添加css文件 <link href="~/Bootstrap3.3.7/css/bootstrap.min.css" rel=" ...
- OnPropertyChanged的使用
#region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; ...
- WPF控件的一些特殊应用
1 checkbox.IsChecked 返回的是bool?类型,需要用bool强转,或者直接和bool类型比较,将发生隐形转换 2 RadioButton有分组属性GroupName
- centos 6.5 搭建ftp 服务器(vsftpd的配置文件说明)
0x00 如何快速的搭建简易的资源发布站 开启简易的python http服务器 1 2 cd /home/your_path python -m SimpleHTTPServer 8000 开启防火 ...
- Python爬虫: "追新番"网站资源链接爬取
“追新番”网站 追新番网站提供最新的日剧和日影下载地址,更新比较快. 个人比较喜欢看日剧,因此想着通过爬取该网站,做一个资源地图 可以查看网站到底有哪些日剧,并且随时可以下载. 资源地图 爬取的资源地 ...
- 数据库连接池之_c3p0
C3p0 1,手动设置参数 @Test public void demo1(){ Connection connection =null; PreparedStatement preparedStat ...