- 浏览: 45183 次
- 性别:
文章分类
最新评论
本文转自:《Java JDK 实例宝典》
解决生产者消费者问题的关键技术点如下:
1.用线程模拟生产者,在run方法中不断地往仓库中存放产品。
2.用线程模拟消费者,在run方法中不断地从仓库中获取产品。
3.仓库类保存产品,当产品数量为0时,调用wait方法,使得当前消费者线程进入等待状态,当有新产品存入时,调用nofify方法,唤醒等待的消费者线程。当仓库满时,调用wait方法,使得当前生产者线程进入等待状态,当有消费者获取产品时,调用notify方法,唤醒等待的生产者线程。
4.停止生产者和消费者线程都通过设置标志位running为false实现。
Product类:
Producer类:
Consumer类:
Warehouse类:
TestProduct类:
解决生产者消费者问题的关键技术点如下:
1.用线程模拟生产者,在run方法中不断地往仓库中存放产品。
2.用线程模拟消费者,在run方法中不断地从仓库中获取产品。
3.仓库类保存产品,当产品数量为0时,调用wait方法,使得当前消费者线程进入等待状态,当有新产品存入时,调用nofify方法,唤醒等待的消费者线程。当仓库满时,调用wait方法,使得当前生产者线程进入等待状态,当有消费者获取产品时,调用notify方法,唤醒等待的生产者线程。
4.停止生产者和消费者线程都通过设置标志位running为false实现。
Product类:
package com.syc.examples.chapter8; public class Product { private String name; // 产品名 public Product(String name){ this.name = name; } public String toString(){ return "Product-" + name; } }
Producer类:
package com.syc.examples.chapter8; public class Producer extends Thread { private Warehouse warehouse; // 生产者存储产品的仓库 private static int produceName = 0; // 产品的名字 private boolean running = false; // 是否需要结束线程的标志位 public Producer(Warehouse use,String name){ super(name); this.warehouse = use; } public void start(){ this.running = true; super.start(); } public void run(){ Product product; try{ while(running){ // 生产并存储产品 product = new Product((++produceName)+""); this.warehouse.storageProduct(product); sleep(300); } }catch(InterruptedException e){ e.printStackTrace(); } } /** * 停止生产者线程 */ public void stopProducer(){ synchronized(warehouse){ this.running =false; // 通知等待仓库的线程 warehouse.notifyAll(); } } /** * 生产者线程是否在运行 * @return */public boolean isRunning(){ return running; } }
Consumer类:
package com.syc.examples.chapter8; /** * 消费者,采用线程,模拟消费者行为 * @author Administrator * */ public class Consumer extends Thread{ private Warehouse warehouse; // 消费者获取产品的仓库 private boolean running = false; // 是否需要结束线程的标志位 public Consumer(Warehouse warehouse,String name){ super(name); this.warehouse = warehouse; } public void start(){ this.running = true; super.start(); } public void run(){ @SuppressWarnings("unused") Product product; try{ while(running){ // 从仓库中获取产品 product = warehouse.getProduct(); sleep(500); } }catch(InterruptedException e){ e.printStackTrace(); } } /** * 停止消费者线程 */ public void stopConsumer(){ synchronized(warehouse){ this.running = false; warehouse.notifyAll(); // 通知等待仓库的线程 } } /** * 消费者线程是否在运行 */ public boolean isRunning(){ return running; } }
Warehouse类:
package com.syc.examples.chapter8; /** * 产品的仓库类 * 内部采用数组来表示循环队列,以存放产品 * @author Administrator * */ public class Warehouse { private static int CAPACITY = 11;//仓库的容量 private Product[] products;// 仓库里的产品 //[front,rear]区间的产品是未被消费的 private int front = 0;// 当前仓库中第一个未被消费的产品的下标 private int rear = 0;// 库中最后一个未被消费的产品的下标加1 public Warehouse(){ this.products = new Product[CAPACITY]; } public Warehouse(int capacity){ this(); if(capacity > 0){ CAPACITY = capacity+1; this.products = new Product[CAPACITY]; } } /** * 从仓库获取一个产品 * @throws InterruptedException */ public Product getProduct() throws InterruptedException{ synchronized(this){ boolean consumerRunning = true; // 标志消费者线程是否还在运行 Thread currentThread = Thread.currentThread();// 获取当前线程 if(currentThread instanceof Consumer){ consumerRunning = ((Consumer)currentThread).isRunning(); }else{ return null; // 非消费者不能获取产品 } // 如果仓库中没有产品,而且消费者线程还在运行,则消费者线程继续等待 while((front==rear) && consumerRunning){ wait(); consumerRunning = ((Consumer)currentThread).isRunning(); } // 如果消费者线程已经没有运行了,则退出该方法,取消获取该产品 if(!consumerRunning){ return null; } // 取当前未被消费的第一个产品 Product product = products[front]; System.out.println("Consumer["+currentThread.getName()+"] getProduct: " + product); // 将当前未被消费产品的下标后移一位,如果到了数组末尾,则移动到首部 front = (front+1+CAPACITY)%CAPACITY; System.out.println("仓库中还没有被消费的产品数量:"+(rear+CAPACITY-front)%CAPACITY); // 通知其他等待线程 notify(); return product; } } /** * 向仓库存储一个产品 * @throws InterruptedException */ public void storageProduct(Product product) throws InterruptedException{ synchronized(this){ boolean producerRunning = true; // 标志生产者线程是否在运行 Thread currentThread = Thread.currentThread(); // 获取当前线程 if(currentThread instanceof Producer){ producerRunning = ((Producer)currentThread).isRunning(); }else{ return; } // 如果最后一个未被消费产品与第一个未被消费的产品的下标紧挨着,则说明没有 // 存储空间,如果没有存储空间而且生产者线程还在运行,则等待仓库释放产品 while(((rear+1)%CAPACITY == front) && producerRunning){ wait(); producerRunning = ((Producer)currentThread).isRunning(); } // 如果生产者线程已经停止了,则停止产品的存储。 if(!producerRunning){ return; } // 保存参数产品到仓库 products[rear] = product; System.out.println("Producer["+Thread.currentThread().getName()+"]storageProduct:"+product); // 将rear下标循环后移一位 rear = (rear+1)%CAPACITY; System.out.println("仓库中还没有被消费的产品数量:"+(rear+CAPACITY-front)%CAPACITY); notify(); } } }
TestProduct类:
package com.syc.examples.chapter8; public class TestProduct { public static void main(String[] args){ Warehouse warehouse = new Warehouse(10); // 建立一个仓库,容量为10 // 建立生产者和消费者 Producer producers1 = new Producer(warehouse,"producer-1"); Producer producers2 = new Producer(warehouse,"producer-2"); Producer producers3 = new Producer(warehouse,"producer-3"); Consumer consumers1 = new Consumer(warehouse,"consumer-1"); Consumer consumers2 = new Consumer(warehouse,"consumer-2"); Consumer consumers3 = new Consumer(warehouse,"consumer-3"); Consumer consumers4 = new Consumer(warehouse,"consumer-4"); // 启动生产者和消费者线程 producers1.start(); producers2.start(); consumers1.start(); producers3.start(); consumers2.start(); consumers3.start(); consumers4.start(); // 让生产者消费者程序预习1600ms try { Thread.sleep(1600); } catch (InterruptedException e) { e.printStackTrace(); } // 停止生产者和消费者的线程 producers1.stopProducer(); consumers1.stopConsumer(); producers2.stopProducer(); consumers2.stopConsumer(); producers3.stopProducer(); consumers3.stopConsumer(); consumers4.stopConsumer(); } }
引用
Producer[producer-1]storageProduct:Product-1
仓库中还没有被消费的产品数量:1
Producer[producer-2]storageProduct:Product-2
仓库中还没有被消费的产品数量:2
Consumer[consumer-1] getProduct: Product-1
仓库中还没有被消费的产品数量:1
Producer[producer-3]storageProduct:Product-3
仓库中还没有被消费的产品数量:2
Consumer[consumer-2] getProduct: Product-2
仓库中还没有被消费的产品数量:1
Consumer[consumer-3] getProduct: Product-3
仓库中还没有被消费的产品数量:0
Producer[producer-1]storageProduct:Product-4
仓库中还没有被消费的产品数量:1
Consumer[consumer-4] getProduct: Product-4
仓库中还没有被消费的产品数量:0
Producer[producer-2]storageProduct:Product-5
仓库中还没有被消费的产品数量:1
Producer[producer-3]storageProduct:Product-6
仓库中还没有被消费的产品数量:2
Consumer[consumer-1] getProduct: Product-5
仓库中还没有被消费的产品数量:1
Consumer[consumer-2] getProduct: Product-6
仓库中还没有被消费的产品数量:0
Producer[producer-1]storageProduct:Product-7
仓库中还没有被消费的产品数量:1
Consumer[consumer-3] getProduct: Product-7
仓库中还没有被消费的产品数量:0
Producer[producer-2]storageProduct:Product-8
仓库中还没有被消费的产品数量:1
Producer[producer-3]storageProduct:Product-9
仓库中还没有被消费的产品数量:2
Consumer[consumer-4] getProduct: Product-8
仓库中还没有被消费的产品数量:1
Producer[producer-1]storageProduct:Product-10
仓库中还没有被消费的产品数量:2
Producer[producer-2]storageProduct:Product-11
仓库中还没有被消费的产品数量:3
Producer[producer-3]storageProduct:Product-12
仓库中还没有被消费的产品数量:4
Consumer[consumer-1] getProduct: Product-9
仓库中还没有被消费的产品数量:3
Consumer[consumer-2] getProduct: Product-10
仓库中还没有被消费的产品数量:2
Consumer[consumer-3] getProduct: Product-11
仓库中还没有被消费的产品数量:1
Producer[producer-1]storageProduct:Product-13
仓库中还没有被消费的产品数量:2
Producer[producer-2]storageProduct:Product-14
仓库中还没有被消费的产品数量:3
Producer[producer-3]storageProduct:Product-15
仓库中还没有被消费的产品数量:4
Consumer[consumer-4] getProduct: Product-12
仓库中还没有被消费的产品数量:3
Consumer[consumer-1] getProduct: Product-13
仓库中还没有被消费的产品数量:2
Consumer[consumer-2] getProduct: Product-14
仓库中还没有被消费的产品数量:1
Producer[producer-1]storageProduct:Product-16
仓库中还没有被消费的产品数量:2
Producer[producer-2]storageProduct:Product-17
仓库中还没有被消费的产品数量:3
Producer[producer-3]storageProduct:Product-18
仓库中还没有被消费的产品数量:4
Consumer[consumer-3] getProduct: Product-15
仓库中还没有被消费的产品数量:3
仓库中还没有被消费的产品数量:1
Producer[producer-2]storageProduct:Product-2
仓库中还没有被消费的产品数量:2
Consumer[consumer-1] getProduct: Product-1
仓库中还没有被消费的产品数量:1
Producer[producer-3]storageProduct:Product-3
仓库中还没有被消费的产品数量:2
Consumer[consumer-2] getProduct: Product-2
仓库中还没有被消费的产品数量:1
Consumer[consumer-3] getProduct: Product-3
仓库中还没有被消费的产品数量:0
Producer[producer-1]storageProduct:Product-4
仓库中还没有被消费的产品数量:1
Consumer[consumer-4] getProduct: Product-4
仓库中还没有被消费的产品数量:0
Producer[producer-2]storageProduct:Product-5
仓库中还没有被消费的产品数量:1
Producer[producer-3]storageProduct:Product-6
仓库中还没有被消费的产品数量:2
Consumer[consumer-1] getProduct: Product-5
仓库中还没有被消费的产品数量:1
Consumer[consumer-2] getProduct: Product-6
仓库中还没有被消费的产品数量:0
Producer[producer-1]storageProduct:Product-7
仓库中还没有被消费的产品数量:1
Consumer[consumer-3] getProduct: Product-7
仓库中还没有被消费的产品数量:0
Producer[producer-2]storageProduct:Product-8
仓库中还没有被消费的产品数量:1
Producer[producer-3]storageProduct:Product-9
仓库中还没有被消费的产品数量:2
Consumer[consumer-4] getProduct: Product-8
仓库中还没有被消费的产品数量:1
Producer[producer-1]storageProduct:Product-10
仓库中还没有被消费的产品数量:2
Producer[producer-2]storageProduct:Product-11
仓库中还没有被消费的产品数量:3
Producer[producer-3]storageProduct:Product-12
仓库中还没有被消费的产品数量:4
Consumer[consumer-1] getProduct: Product-9
仓库中还没有被消费的产品数量:3
Consumer[consumer-2] getProduct: Product-10
仓库中还没有被消费的产品数量:2
Consumer[consumer-3] getProduct: Product-11
仓库中还没有被消费的产品数量:1
Producer[producer-1]storageProduct:Product-13
仓库中还没有被消费的产品数量:2
Producer[producer-2]storageProduct:Product-14
仓库中还没有被消费的产品数量:3
Producer[producer-3]storageProduct:Product-15
仓库中还没有被消费的产品数量:4
Consumer[consumer-4] getProduct: Product-12
仓库中还没有被消费的产品数量:3
Consumer[consumer-1] getProduct: Product-13
仓库中还没有被消费的产品数量:2
Consumer[consumer-2] getProduct: Product-14
仓库中还没有被消费的产品数量:1
Producer[producer-1]storageProduct:Product-16
仓库中还没有被消费的产品数量:2
Producer[producer-2]storageProduct:Product-17
仓库中还没有被消费的产品数量:3
Producer[producer-3]storageProduct:Product-18
仓库中还没有被消费的产品数量:4
Consumer[consumer-3] getProduct: Product-15
仓库中还没有被消费的产品数量:3
发表评论
-
【J2SE】Map.Entry 类使用简介
2012-05-10 11:12 518本文转自:http://www.cnblogs.com/guo ... -
【J2SE】Static Nested Class、Inner Class、Anonymous Inner Class
2012-05-05 11:58 0本文转自:http://blog.csdn.net/welco ... -
【J2SE】Anonymous Inner Class (匿名内部类)
2012-05-05 11:56 0本文转自:http://www.iteye ... -
【J2SE】Java 运行时异常
2012-05-05 10:39 0本文转自:http://amyer.ite ... -
【J2SE】再谈线程:生产者与消费者
2012-05-04 23:36 0本文转自:http://www.blogjava.net/li ... -
【J2SE】Java线程:并发协作-生产者消费者模型
2012-05-04 23:34 0本文转自:http://lavasoft.blog.51cto ... -
【J2SE】线程7种状态的相互转换
2012-05-04 22:48 680本文转自:http://www.blogj ... -
【J2SE】详解java类的生命周期
2012-05-12 21:23 677本文转自:http://www.2cto.com/kf/20 ... -
Java文件操作大全
2012-05-02 13:29 0本文转自:http://www.blog ... -
【基础】Java Annotation详解
2012-05-02 11:50 0本文转自:http://www.blogjava.net/c ... -
【J2SE】Java JDBC数据库连接池总结
2012-05-03 23:21 890本文转自:http://www.blogj ... -
【基础】JAVA中String与StringBuffer的区别
2012-05-01 20:28 0String和StringBuffer的区别,网上资料可以说是 ... -
【J2SE】Java常见异常小结
2012-05-12 21:22 824本文重在Java中异常机制 ... -
【基础】Java异常处理及异常机制介绍
2012-05-01 19:54 0当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内 ... -
【基础】Java中finalize()
2012-05-01 19:39 0垃圾回收器要回收对象的时候,首先要调用这个类的finalize ... -
【基础】finally的一些测试
2012-05-01 16:37 0finally是在执行returen的中间执行。 pac ... -
【J2SE】Java之Path、CLASSPATH的概念解析
2012-05-03 23:17 791本文转自:http://blog.sin ... -
【J2SE】Java 反射机制简述
2012-05-03 23:19 667本文转自:http://zk1878.iteye.com/b ... -
【J2SE】Java中生成对象的4方式
2012-05-01 12:46 0本文转自:http://blog.sina.com.cn/s/ ... -
【J2SE】Anonymous Inner Class 匿名内部类
2012-04-27 19:05 766本文转自: public class T ...
相关推荐
典型的同步模式如生产者-消费者模型,使用 `wait()`、`notify()` 和 `notifyAll()` 方法协调线程间的协作。 8. 字符串与包装类:`String` 类是不可变的,所有对 `String` 的操作都会生成新的字符串对象。为了将基本...
- **支付系统**:在移动支付中,商家的收款二维码被广泛使用,消费者扫描后即可完成支付。 - **广告推广**:二维码可以链接到产品详情页、优惠券或活动页面,方便用户快速了解和参与。 - **物联网**:在物流和供应链...
在电子商务中,条形码也可用于订单处理和物流跟踪,确保包裹准确无误地送达消费者手中。 此外,条形码还可以结合数据库系统,通过条形码扫描快速查询商品信息,避免人工输入错误。在报表和标签打印中,Java条形码库...
它允许不同平台上的应用程序通过网络进行通信,实现了服务提供者和服务消费者之间的松耦合。 在Java中,Apache Axis是一个流行的开源工具,用于创建和部署Web服务。下面是关于如何使用Axis创建和调用Java ...
3. **营销活动**:品牌商通过在产品包装或宣传资料上附带二维码,引导消费者参与促销活动或了解更多信息。 4. **数据存储**:在某些场合下,可以通过生成包含特定信息的条形码来存储少量的数据。 ### 知识点五:...
对于初学者,通常从J2SE开始。安装SDK后,需要注意配置系统环境变量,比如Path和ClassPath,以确保能够顺利运行Java编译器(javac.exe)和解释器(java.exe),并能访问到必要的类库。 总的来说,Java以其丰富的...
3. UDDI(Universal Description, Discovery, and Integration):一种服务注册和发现机制,允许服务提供商发布服务信息,消费者查找所需服务。 Java中开发Web服务的步骤通常包括:创建服务接口、实现服务类、生成...
Apache Axis是Apache软件基金会开发的一个开源工具,用于简化Web服务的开发、部署和消费。本文主要介绍如何使用Axis来创建和使用Web服务。 首先,安装Axis是开发Web服务的基础。在J2SE SDK 1.3或1.4环境下,你需要...
J2ME是SUN Microsystems为嵌入式设备和消费电子产品提供的开发环境,与J2SE(Java 2 Standard Edition)和J2EE(Java 2 Enterprise Edition)一同构成了Java技术的三大分支。J2ME的架构包括配置(Configurations)和...
- 相比于一般电子钱包,本系统的消费者风险较低,因为系统记录了长期消费历史。 - 与金融卡相比,本系统的安全性更高,因为它使用智能卡和加密技术。 4. **信息技术**: - **J2SE**:Java 2 Standard Edition,...
- J2SE(Java 2 Platform Standard Edition)是桌面应用和轻量级商务应用的基础。 4. **Java特性**: - Java是区分大小写的,关键字如"class"必须正确拼写。 - 源文件名通常与主类名一致,但不是强制的。 - `...
例如,Java 1.2引入了Java 2平台,将Java分为不同的应用版本,包括J2ME、J2SE和J2EE,分别用于移动设备、桌面系统和企业级应用。Java 5.0(Java 1.5)引入了泛型、枚举等增强功能,提高了代码的可读性和易用性。 ...
其初衷是为了适应网络计算的需求,特别是为了支持嵌入式设备和消费类电子产品。 - Java的前身是Oak语言,但由于商标问题最终改名为Java。 - 2009年,Sun Microsystems被Oracle公司收购,自此Java成为了Oracle旗下...
Java 1.2的发布标志着Java的成熟,后续的版本如Java 2(J2SE、J2ME、J2EE)、Java SE、Java EE、Java ME和现在的Java 17等,不断优化和完善,满足了从桌面应用到企业级服务再到移动设备的各种需求。 总之,Java以其...
- **应用场景**:适用于开发移动应用、消费电子产品上的简单应用等。 ### Java 开发步骤 Java 程序的开发通常遵循以下步骤: 1. **编写源文件 (.java)**:使用文本编辑器或集成开发环境 (IDE) 编写 Java 源代码。...
高淇的300集视频教程旨在帮助初学者从基础扎实地掌握Java,强调良好的学习习惯和理解Java的核心优势。Java 的发展历程包括了J2EE、J2SE和J2ME三个主要版本: 1. **J2EE** (Java 2 Enterprise Edition) - 主要针对...
J2SE是用于桌面应用和基础商务应用的基础平台,J2EE则针对服务器端,提供企业级应用开发,而J2ME则为消费电子和嵌入式设备提供支持。 2. **语言特点**:Java 是一种面向对象的语言,其语法简洁,具备平台无关性、...