`

JDK1.5 生产消费者

阅读更多

ArrayBlockingQueue

       一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。

ArrayBlockingQueue的常用方法:

       put:将指定的元素添加到此队列的尾部,如果必要,将等待可用的空间。

       take:检索并移除此队列的头部,如果此队列不存在任何元素,则一直等待。

       offer:将指定的元素插入到此队列的尾部(如果可能),如果此队列已满,则立即返回。

       poll:检索并移除此队列的头,如果此队列为空,则返回null

说明:putoffer都是向队列中添加元素,takepoll都是从队列中移除元素。puttake对应一组,是阻塞式的;offerpoll对应一组,是非阻塞式的。

 

实例:

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

 

分享到:
评论

相关推荐

    Java JDK1.5 生产消费者模式解决方案

    在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`接口,这些工具大大提升了生产者消费者模式的实现效率和线程安全性。 生产者消费者模式...

    jdk1.5并发新特性.

    这简化了生产者-消费者模型的实现,因为线程间的同步问题已经被内建在队列中。常见的实现包括 `LinkedBlockingQueue` 和 `ArrayBlockingQueue`。 4. `ConcurrentMap`: `ConcurrentMap` 是并发环境下对 `Map` 接口...

    jdk5 下 CXF 开发 WEB Service client 所需jar 包

    在JDK 5环境下,Apache CXF是一个常用的框架,用于开发和消费Web服务,无论是作为服务提供者还是客户端。CXF支持多种协议,如SOAP、RESTful、WS-*等,使得开发者能方便地实现Web服务接口。 本篇内容将详细讲解在JDK...

    Multi person chat_jdk1.8_java编程_

    5. **线程间通信**:Java提供了阻塞队列(BlockingQueue)等机制,可以方便地实现在线程间的通信和数据传递,例如生产者消费者模型。 在实际开发中,为了实现多人聊天功能,开发者还需要熟悉Socket编程,理解TCP/IP...

    经典Java多线程与并发库高级应用

    阻塞队列结合了线程安全的队列和阻塞机制,使得生产者和消费者能够更协调地工作。而同步集合类提供了线程安全的集合实现。 在多线程技术的实际应用中,例如Android应用开发和游戏开发中,多线程是提升程序性能和...

    java线程池

    在JDK1.5及以后的版本中,`ExecutorService`作为线程池的主要接口,提供了基础的线程池服务。然而,标准的`ExecutorService`线程池在特定场景下可能无法满足所有的需求,比如对线程池的伸缩性和任务队列的控制。 在...

    Java JDK实例宝典

    消费者问题 8. 7 线程优先级 8. 8 列出虚拟机中所有的线程 8. 9 守护线程Daemon 8. 10 线程池 8. 11 一个死锁的例子 8. 12 定时器Timer 第9章 Java GUI 9. 1 日历 9. 2 开窗户...

    Android多线程全新讲解[整理].pdf

    最后,`ArrayBlockingQueue`是一种**阻塞队列**,它是一个线程安全的队列,用于在生产者和消费者之间传递数据。同步集合,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,也是Java并发编程中的重要工具。 总的...

    网上商城_是用jsp写的

    通过这个网上商城,消费者可以方便地搜索、查看和购买所需的运动商品,而商家则可以通过这个平台更好地管理库存、处理订单,根据销售数据调整生产和营销策略。 项目的主要内容包括以下几个功能模块: 1. 客户管理...

    电子产品网上选购系统说明书.docx

    运行环境涵盖了各种硬件和软件配置,包括不同版本的Windows和Linux操作系统,推荐使用Tomcat5.5服务器和MySQL4.1数据库,编程语言为Java,使用JDK1.5进行编译,支持IE5.0和Netscape Browser 8以上的浏览器版本。...

    Java_并发核心编程-中英文版

    7. **并发设计模式**:学习经典的并发设计模式,如生产者-消费者模型、读写锁策略、双检锁/双重校验锁(DCL)、屏障和工读器-写者模式等,这些模式可以帮助你编写出更加高效和可维护的并发代码。 8. **Java内存模型...

    ConditionVariablesJAVA多线程[定义].pdf

    特别是在实现生产者-消费者模式、读者-写者模式等经典的同步问题时,条件变量提供了一种有效的解决方案。在使用过程中,开发者应当仔细处理线程的挂起和唤醒,避免出现死锁、资源竞争等问题,并确保线程安全。

    1、 ActiveMQ 安装1

    - 开发人员可以使用 JMS API 创建生产者和消费者来发送和接收消息 请注意,为了安全起见,建议在生产环境中更改默认的管理员用户名和密码,以及根据需要配置防火墙以限制对 ActiveMQ 端口的访问。 ActiveMQ 支持...

    RocketMq快速入门文档

    在Windows环境下,需要配置环境变量,启动命名服务器和消息服务器,并进行测试,确保系统能够正常运行生产者和消费者程序。 总的来说,RocketMQ提供了一个高效、可扩展的消息传递平台,帮助开发者实现分布式系统间...

    google collection

    - **TransferQueue**:是一种特殊的队列实现,它可以将元素传递给等待的消费者线程。 - **应用场景**:在低线程池大小的情况下,优先使用等待中的线程而非创建新线程。 5. **排序算法改进**: - **TimSort**:...

    java后端技术问题汇总(面试必看)

    - **解耦**:消息队列可以将生产者和消费者分离,两者无需直接交互,降低了系统间的耦合度,使得系统扩展和维护变得更加容易。 - **异步处理**:通过消息队列,非核心业务可以异步执行,主线程可以快速响应,提高...

    java编程基础,应用与实例

    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接口 ...

    组件zookeeper,redis,kafka,activemq,cat搭建

    - 通过 JMS API 编写生产者和消费者测试消息传递功能。 - 排错时检查日志文件定位问题。 #### 五、CAT 监控系统安装与调试 **5.1 CAT 概述** CAT 是一个高性能、低成本的分布式监控系统,主要用于实时监控系统的...

    java初学者必看

    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 异常捕获...

Global site tag (gtag.js) - Google Analytics