阻塞队列之LinkedBlockingQueue
2019-02-21 22:37
141 查看
LinkedBlockingQueue特点:
1、数据结构:单向链表;
2、有界队列,默认长度为:Integer.MAX_VALUE;
3、和ArrayBlockingQueue一样,不允许放入空值;
4、元素按FIFO排序;
对比ArrayBlockingQueue:
1、存储结构不同,ArrayBlockingQueue 采用对象数组存储数据;LinkedBlockingQueue采用单向链表存储数据;
2、构造不同,ArrayBlockingQueue必须指定长度,且可以指定是否使用公平锁定及初始集合;而LinkedBlockingQueue可以不指定长度,默认值是Integer.MAX_VALUE,另外LinkedBlockingQueue不支持参数化设置公平锁或非公平锁,默认是非公平锁:NonfairSync;
3、操作方法相同,ArrayBlockingQueue放入元素:add(抛异常)、offer(返回true、false)、put(阻塞等待),取出元素:poll、take;而LinkedBlockingQueue也都一样;
生产者消费者模式中都可以使用阻塞队列,关键是要用put阻塞方法和take阻塞方法;
[code]import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /** * 基本和ArrayBlockingQueue一样 区别有: * ArrayBlockingQueue--数组结构、必须指定长度、可以定制使用工作锁或非公平锁; * LinkedBlockingQueue--单向链表结构、可以不指定长度,默认是Integer.MAX_VALUE,不能指定使用何种锁; */ public class LinkedBlockingQueueTest { private ExecutorService threadPool = Executors.newFixedThreadPool(2); private LinkedBlockingQueue<String> linkedBlockingQueue = new LinkedBlockingQueue<String>(); public LinkedBlockingQueueTest() { } private void test() { // put threadPool.submit(new Runnable() { public void run() { System.out.println("Please input:"); Scanner sc = new Scanner(System.in); String readLine = null; while (true) { readLine = sc.nextLine(); try { if ("quit".equalsIgnoreCase(readLine)) { linkedBlockingQueue.put("quit"); break; } else { linkedBlockingQueue.put(readLine); } } catch (Exception e) { e.printStackTrace(); } } sc.close(); } }); // take threadPool.submit(new Runnable() { public void run() { try { String takeLine = null; while (true) { takeLine = linkedBlockingQueue.take(); if ("quit".equalsIgnoreCase(takeLine)) { break; } else { System.out.println("take:" + takeLine); } TimeUnit.MILLISECONDS.sleep(2000); } } catch (InterruptedException e) { e.printStackTrace(); } } }); } public static void main(String[] args) { LinkedBlockingQueueTest linkedBlockingQueueTest = new LinkedBlockingQueueTest(); linkedBloc 4000 kingQueueTest.test(); } }
相关文章推荐
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析(还没看,先马)
- Spring MVC 基于阻塞队列 LinkedBlockingQueue 的同步长轮询功能实现
- java消费者生产者模式及JDK之阻塞队列LinkedBlockingQueue实现
- 移动端并发编程基础篇-阻塞队列ArrayBlockingQueue&LinkedBlockingQueue
- java-并发集合-阻塞队列 LinkedBlockingQueue 演示
- LinkedBlockingQueue阻塞队列offer()操作抛出中断异常
- 四 : LinkedBlockingQueue 链阻塞队列
- 阻塞队列--LinkedBlockingQueue
- JAVA并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
- JDK源码分析之主要阻塞队列实现类LinkedBlockingQueue
- 深入理解阻塞队列(三)——LinkedBlockingQueue源码分析
- 并发队列 – 无界阻塞队列 LinkedBlockingQueue 原理探究
- 关于java中阻塞队列(LinkedBlockingQueue)中任务执行失败后的重试机制几种方案
- 深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
- 并发队列 – 无界阻塞队列 LinkedBlockingQueue 原理探究
- 进阶篇:同步阻塞队列之LinkedBlockingQueue(十一)
- 11.并发包阻塞队列之LinkedBlockingQueue
- java5中的阻塞队列BlockingQueue和非阻塞队列ConcurrentLinkedQueue
- 深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
- 阻塞队列--线程安全的LinkedBlockingQueue