ArrayBlockingQueue:
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。
ArrayBlockingQueue的常用方法:
put:将指定的元素添加到此队列的尾部,如果必要,将等待可用的空间。
take:检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。
offer:将指定的元素插入到此队列的尾部(如果可能),如果此队列已满,则立即返回。
poll:检索并移除此队列的头,如果此队列为空,则返回null。
说明:put、offer都是向队列中添加元素,take、poll都是从队列中移除元素。put和take对应一组,是阻塞式的;offer、poll对应一组,是非阻塞式的。
实例:
package com.bijian.thread; import java.util.concurrent.BlockingQueue; public class Producer implements Runnable { private String name = null; private BlockingQueue<String> queue = null; public Producer(String name, BlockingQueue<String> queue) { this.name = name; this.queue = queue; } @Override public void run() { try { for (int i = 0; i < 10; i++) { queue.put(name + ": " + i); System.out.println("Product:" + name + ": " + i); Thread.sleep((long) (Math.random() * 1000)); } } catch (Exception e) { e.printStackTrace(); } } }
package com.bijian.thread; import java.util.concurrent.BlockingQueue; public class Consumer implements Runnable { private String name; private BlockingQueue<String> queue = null; public Consumer(String name, BlockingQueue<String> queue) { this.name = name; this.queue = queue; } @Override public void run() { try { for (int i = 0; i < 5; i++) { String prod = queue.take(); System.out.println("Consumer:" + name + ": " + prod); Thread.sleep((long) (Math.random() * 1000)); } } catch (Exception e) { e.printStackTrace(); } } }
package com.bijian.thread; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { BlockingQueue<String> queue = new ArrayBlockingQueue<String> (3); ExecutorService service = Executors.newCachedThreadPool(); Producer producer = new Producer("P1", queue); Consumer consumer = new Consumer("C1", queue); Consumer consumer1 = new Consumer("C2", queue); service.execute(producer); service.execute(consumer); service.execute(consumer1); service.shutdown(); } }
运行结果:
Product:P1: 0 Consumer:C1: P1: 0 Product:P1: 1 Consumer:C2: P1: 1 Product:P1: 2 Consumer:C1: P1: 2 Product:P1: 3 Consumer:C2: P1: 3 Product:P1: 4 Consumer:C1: P1: 4 Product:P1: 5 Consumer:C2: P1: 5 Product:P1: 6 Consumer:C1: P1: 6 Product:P1: 7 Consumer:C2: P1: 7 Product:P1: 8 Product:P1: 9 Consumer:C1: P1: 8 Consumer:C2: P1: 9
相关推荐
在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`接口,这些工具大大提升了生产者消费者模式的实现效率和线程安全性。 生产者消费者模式...
这简化了生产者-消费者模型的实现,因为线程间的同步问题已经被内建在队列中。常见的实现包括 `LinkedBlockingQueue` 和 `ArrayBlockingQueue`。 4. `ConcurrentMap`: `ConcurrentMap` 是并发环境下对 `Map` 接口...
在JDK 5环境下,Apache CXF是一个常用的框架,用于开发和消费Web服务,无论是作为服务提供者还是客户端。CXF支持多种协议,如SOAP、RESTful、WS-*等,使得开发者能方便地实现Web服务接口。 本篇内容将详细讲解在JDK...
5. **线程间通信**:Java提供了阻塞队列(BlockingQueue)等机制,可以方便地实现在线程间的通信和数据传递,例如生产者消费者模型。 在实际开发中,为了实现多人聊天功能,开发者还需要熟悉Socket编程,理解TCP/IP...
阻塞队列结合了线程安全的队列和阻塞机制,使得生产者和消费者能够更协调地工作。而同步集合类提供了线程安全的集合实现。 在多线程技术的实际应用中,例如Android应用开发和游戏开发中,多线程是提升程序性能和...
在JDK1.5及以后的版本中,`ExecutorService`作为线程池的主要接口,提供了基础的线程池服务。然而,标准的`ExecutorService`线程池在特定场景下可能无法满足所有的需求,比如对线程池的伸缩性和任务队列的控制。 在...
消费者问题 8. 7 线程优先级 8. 8 列出虚拟机中所有的线程 8. 9 守护线程Daemon 8. 10 线程池 8. 11 一个死锁的例子 8. 12 定时器Timer 第9章 Java GUI 9. 1 日历 9. 2 开窗户...
最后,`ArrayBlockingQueue`是一种**阻塞队列**,它是一个线程安全的队列,用于在生产者和消费者之间传递数据。同步集合,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,也是Java并发编程中的重要工具。 总的...
通过这个网上商城,消费者可以方便地搜索、查看和购买所需的运动商品,而商家则可以通过这个平台更好地管理库存、处理订单,根据销售数据调整生产和营销策略。 项目的主要内容包括以下几个功能模块: 1. 客户管理...
运行环境涵盖了各种硬件和软件配置,包括不同版本的Windows和Linux操作系统,推荐使用Tomcat5.5服务器和MySQL4.1数据库,编程语言为Java,使用JDK1.5进行编译,支持IE5.0和Netscape Browser 8以上的浏览器版本。...
7. **并发设计模式**:学习经典的并发设计模式,如生产者-消费者模型、读写锁策略、双检锁/双重校验锁(DCL)、屏障和工读器-写者模式等,这些模式可以帮助你编写出更加高效和可维护的并发代码。 8. **Java内存模型...
特别是在实现生产者-消费者模式、读者-写者模式等经典的同步问题时,条件变量提供了一种有效的解决方案。在使用过程中,开发者应当仔细处理线程的挂起和唤醒,避免出现死锁、资源竞争等问题,并确保线程安全。
- 开发人员可以使用 JMS API 创建生产者和消费者来发送和接收消息 请注意,为了安全起见,建议在生产环境中更改默认的管理员用户名和密码,以及根据需要配置防火墙以限制对 ActiveMQ 端口的访问。 ActiveMQ 支持...
在Windows环境下,需要配置环境变量,启动命名服务器和消息服务器,并进行测试,确保系统能够正常运行生产者和消费者程序。 总的来说,RocketMQ提供了一个高效、可扩展的消息传递平台,帮助开发者实现分布式系统间...
- **TransferQueue**:是一种特殊的队列实现,它可以将元素传递给等待的消费者线程。 - **应用场景**:在低线程池大小的情况下,优先使用等待中的线程而非创建新线程。 5. **排序算法改进**: - **TimSort**:...
- **解耦**:消息队列可以将生产者和消费者分离,两者无需直接交互,降低了系统间的耦合度,使得系统扩展和维护变得更加容易。 - **异步处理**:通过消息队列,非核心业务可以异步执行,主线程可以快速响应,提高...
14.7.3 生产者与消费者 221 14.7.4 多消费者 224 14.8 stop()、suspend()和resume() 225 14.9 巩固练习 226 第15章 常用API之二 228 15.1 Collection接口 228 15.1.1 Set接口 228 15.1.2 List接口 ...
- 通过 JMS API 编写生产者和消费者测试消息传递功能。 - 排错时检查日志文件定位问题。 #### 五、CAT 监控系统安装与调试 **5.1 CAT 概述** CAT 是一个高性能、低成本的分布式监控系统,主要用于实时监控系统的...
11.5.3 运行生产者/消费者 11.6 死锁 11.7 本章习题 第12章 异常处理 12.1 异常的概念 12.2 异常的基本样式 12.3 Java异常类 12.3.1 异常类层次结构 12.3.2 异常处理方法 12.4 异常捕获 12.4.1 异常捕获...