在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻 塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据 实际需要选用阻塞队列或者非阻塞队列。
注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生不确定的结果。
LinkedBlockingQueue
由于LinkedBlockingQueue实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候 会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。
package cn.thread; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; /** * 多线程模拟实现生产者/消费者模型 * * @author 林计钦 * @version 1.0 2013-7-25 下午05:23:11 */ public class BlockingQueueTest2 { /** * * 定义装苹果的篮子 * */ public class Basket { // 篮子,能够容纳3个苹果 BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3); // 生产苹果,放入篮子 public void produce() throws InterruptedException { // put方法放入一个苹果,若basket满了,等到basket有位置 basket.put("An apple"); } // 消费苹果,从篮子中取走 public String consume() throws InterruptedException { // take方法取出一个苹果,若basket为空,等到basket有苹果为止(获取并移除此队列的头部) return basket.take(); } } // 定义苹果生产者 class Producer implements Runnable { private String instance; private Basket basket; public Producer(String instance, Basket basket) { this.instance = instance; this.basket = basket; } public void run() { try { while (true) { // 生产苹果 System.out.println("生产者准备生产苹果:" + instance); basket.produce(); System.out.println("!生产者生产苹果完毕:" + instance); // 休眠300ms Thread.sleep(300); } } catch (InterruptedException ex) { System.out.println("Producer Interrupted"); } } } // 定义苹果消费者 class Consumer implements Runnable { private String instance; private Basket basket; public Consumer(String instance, Basket basket) { this.instance = instance; this.basket = basket; } public void run() { try { while (true) { // 消费苹果 System.out.println("消费者准备消费苹果:" + instance); System.out.println(basket.consume()); System.out.println("!消费者消费苹果完毕:" + instance); // 休眠1000ms Thread.sleep(1000); } } catch (InterruptedException ex) { System.out.println("Consumer Interrupted"); } } } public static void main(String[] args) { BlockingQueueTest2 test = new BlockingQueueTest2(); // 建立一个装苹果的篮子 Basket basket = test.new Basket(); ExecutorService service = Executors.newCachedThreadPool(); Producer producer = test.new Producer("生产者001", basket); Producer producer2 = test.new Producer("生产者002", basket); Consumer consumer = test.new Consumer("消费者001", basket); service.submit(producer); service.submit(producer2); service.submit(consumer); // 程序运行5s后,所有任务停止 // try { // Thread.sleep(1000 * 5); // } catch (InterruptedException e) { // e.printStackTrace(); // } // service.shutdownNow(); } }
ConcurrentLinkedQueue
ConcurrentLinkedQueue是Queue的一个安全实现.Queue中元素按FIFO原则进行排序.采用CAS操作,来保证元素的一致性。
LinkedBlockingQueue 是一个线程安全的阻塞队列,它实现了BlockingQueue接口,BlockingQueue接口继承自java.util.Queue接口,并在这 个接口的基础上增加了take和put方法,这两个方法正是队列操作的阻塞版本。
package cn.thread; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ConcurrentLinkedQueueTest { private static ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>(); private static int count = 2; // 线程个数 //CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 private static CountDownLatch latch = new CountDownLatch(count); public static void main(String[] args) throws InterruptedException { long timeStart = System.currentTimeMillis(); ExecutorService es = Executors.newFixedThreadPool(4); ConcurrentLinkedQueueTest.offer(); for (int i = 0; i < count; i++) { es.submit(new Poll()); } latch.await(); //使得主线程(main)阻塞直到latch.countDown()为零才继续执行 System.out.println("cost time " + (System.currentTimeMillis() - timeStart) + "ms"); es.shutdown(); } /** * 生产 */ public static void offer() { for (int i = 0; i < 100000; i++) { queue.offer(i); } } /** * 消费 * * @author 林计钦 * @version 1.0 2013-7-25 下午05:32:56 */ static class Poll implements Runnable { public void run() { // while (queue.size()>0) { while (!queue.isEmpty()) { System.out.println(queue.poll()); } latch.countDown(); } } }
相关推荐
### 并发队列 ConcurrentLinkedQueue 和阻塞队列 LinkedBlockingQueue 用法详解 #### 一、并发队列 ConcurrentLinkedQueue 概述 `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能...
《LinkedBlockingQueue与ConcurrentLinkedQueue的比较与应用》 在Java并发编程中,队列是一种重要的数据结构,尤其在多线程环境下的任务调度和数据传递中扮演着关键角色。LinkedBlockingQueue和...
java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...
本文将深入探讨`ConcurrentLinkedQueue`、`ArrayBlockingQueue`以及`LinkedBlockingQueue`这三种实现,并分析它们的设计原理与应用场景。 首先,我们来看`ConcurrentLinkedQueue`。它是基于非阻塞算法(CAS,...
1. 并发队列:Java 的并发库提供了一组线程安全的队列实现,如 ConcurrentLinkedQueue 和 LinkedBlockingQueue,它们在多线程环境中高效且安全。 2. 队列优先级排序:PriorityQueue 是一个可以按照特定顺序排序的...
这可能涉及到Java的并发库,如ExecutorService、ScheduledExecutorService,以及可能的队列数据结构,如Java的ConcurrentLinkedQueue或LinkedBlockingQueue,用于处理异步任务和批量操作。 在压缩包中的"cmdline-...
container Collection 标记: 顶级接口 List 标记: interface ArrayList 标记: class ...LinkedBlockingQueue ...ConcurrentLinkedQueue ...LinkedBlockingQueue 链表结构实现,无界队列(默认上限Integer.MAX_VALUE)
例如,如果需要高效的并发操作,可以选择`ConcurrentLinkedQueue`或`LinkedBlockingQueue`;如果对元素的顺序有特定要求,可以使用`PriorityQueue`;对于一般用途且对性能要求较高,`ArrayDeque`是不错的选择。 ...
- 并发容器:如ConcurrentLinkedQueue、LinkedBlockingQueue等线程安全的数据结构。 3. **多线程** - 线程创建:Thread类和Runnable接口,线程池ExecutorService的使用。 - 线程同步:synchronized关键字,wait...
- Java 提供了多种队列实现,如 `LinkedList`、`ArrayDeque` 和并发类 `ConcurrentLinkedQueue`、`LinkedBlockingQueue` 等。其中,`ConcurrentLinkedQueue` 是一个非阻塞的线程安全队列,而 `LinkedBlockingQueue`...
20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类...
- **并发容器**:CopyOnWriteArrayList、ConcurrentLinkedQueue、LinkedBlockingQueue等,适用于高并发读取场景。 5. **并发工具类** - **CountDownLatch**:计数器,用于多线程协同工作,计数到零后所有线程继续...
4. ConcurrentLinkedQueue 是一个基于链接节点的无界并发队列,它使用了链表结构实现 FIFO(先进先出),并且不使用锁,而是依赖于 CAS 操作。 5. LinkedBlockingQueue、ArrayBlockingQueue 和 ...
4. **ConcurrentLinkedQueue**: 这是一个基于链表实现的无界并发队列,使用CAS保证线程安全,元素的插入和删除操作是高效的,没有容量限制,但可能会消耗大量内存。 5. **ConcurrentLinkedDeque**: 与...
2. **并发队列**:并发队列如`ConcurrentLinkedQueue`或`LinkedBlockingQueue`,是线程安全的数据结构,用于在多线程环境中存储和传递任务。它们提供了高效的并发操作,例如添加、移除元素,同时保证了数据的一致性...
`Concurrent`包包含了大量设计精良且线程安全的数据结构,如`ConcurrentHashMap`(线程安全的哈希映射),`ConcurrentLinkedQueue`(无界的并发队列)和`CopyOnWriteArrayList`(写时复制的列表)等。这些数据结构在...
java bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque ...LinkedBlockingQueue ...ConcurrentLinkedQueue (done) C
另外,为了进一步优化性能,我们还可以考虑使用`LinkedBlockingQueue`或`ConcurrentLinkedQueue`这样的并发队列来管理缓存的入队和出队操作。这些队列在多线程环境下的性能表现优秀,能够有效减少锁竞争,提高并发...
为了实现一个线程安全的队列,我们可以使用`ConcurrentLinkedQueue`,它是线程安全且无阻塞的队列,适用于高并发场景。另外,`LinkedBlockingQueue`是另一个线程安全的选择,它提供了阻塞操作,当队列为空时,取元素...
3. **并发集合**:如`ConcurrentLinkedQueue`、`LinkedBlockingQueue`、`ConcurrentSkipListMap`等,这些集合类在设计时就考虑了并发性能,能够在不使用锁的情况下进行并发修改,从而提高了并发效率。 4. **锁**:`...