java多线程总结六:经典生产者消费者问题实现
2011-11-01 11:50
447 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/crpeng2007/article/details/84057394
这是个线程同步的经典例子,源代码如下:
view plaincopy to clipboardprint?
- <span style="font-size:16px;">package demo.thread;
- /**
- *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。
- *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品
- */
- public class ProducersAndConsumers {
- public static void main(String[] args) {
- Storage storage = new Storage();
- Thread consumer = new Thread(new Consumer(storage));
- consumer.setName("消费者");
- Thread producer = new Thread(new Producer(storage));
- producer.setName("生产者");
- consumer.start();
- producer.start();
- }
- }
- /**
- * 消费者
- */
- class Consumer implements Runnable {
- private Storage storage;
- public Consumer(Storage storage) {
- this.storage = storage;
- }
- @Override
- public void run() {
- storage.pop();
- }
- }
- /**
- * 生产者
- */
- class Producer implements Runnable {
- private Storage storage;
- public Producer(Storage storage) {
- this.storage = storage;
- }
- @Override
- public void run() {
- Product product = new Product("090505 7ff7 105", "电话");
- storage.push(product);
- }
- }
- /**
- * 产品类
- */
- class Product {
- private String id;// 产品id
- private String name;// 产品名称
- public Product(String id, String name) {
- this.id = id;
- this.name = name;
- }
- @Override
- public String toString() {
- return "(产品ID:" + id + " 产品名称:" + name + ")";
- }
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- /**
- *仓库
- */
- class Storage {
- // 仓库容量为10
- private Product[] products = new Product[10];
- private int top = 0;
- // 生产者往仓库中放入产品
- public synchronized void push(Product product) {
- while (top == products.length) {
- try {
- wait();//仓库已满,等待
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //把产品放入仓库
- products[top++] = product;
- System.out.println(Thread.currentThread().getName() + " 生产了产品"
- + product);
- notifyAll();//唤醒等待线程
- }
- // 消费者从仓库中取出产品
- public synchronized Product pop() {
- while (top == 0) {
- try {
- wait();//仓库空,等待
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //从仓库中取产品
- --top;
- Product p = new Product(products[top].getId(), products[top].getName());
- products[top] = null;
- System.out.println(Thread.currentThread().getName() + " 消费了产品" + p);
- notifyAll();//唤醒等待线程
- return p;
- }
- }
- </span>
运行结果:
生产者 生产了产品(产品ID:010435111 产品名称:电话)
消费者 消费了产品(产品ID:010435111 产品名称:电话)
相关文章推荐
- java多线程总结六:经典生产者消费者问题实现
- java多线程总结六:经典生产者消费者问题实现
- java多线程总结六:经典生产者消费者问题实现
- 多线程经典问题之生产者消费者问题的JAVA实现
- java多线程实现生产者与消费者---经典问题
- Java总结(十一)——通过Callable接口实现多线程,生产者消费者问题,多线下载(复制)文件
- 多线程经典案例——生产者/消费者问题的Java实现与详解
- Java多线程实现生产者消费者延伸问题
- 【线程同步】java实现生产者消费者问题与线程中的wait与notify总结
- java多线程总结六:经典生产者消费者问题实现
- java多线程经典的生产者消费者问题
- java多线程之生产者和消费者经典问题案例
- Java 多线程实现生产者消费者问题(wait/notify)
- 经典问题生产者与消费者java并发线程模拟实现
- java代码实现多线程消费者生产者问题。
- java多线程经典例题:生产者/消费者问题
- 关于网宿厦门研发中心笔试的一道PV操作题:利用java中的多线程实现生产者与消费者的同步问题
- 从java多线程实现“生产者-消费者”模型来谈谈操作系统中线程状态的转换及线程同步的总结
- java利用lock和unlock实现消费者与生产者问题(多线程)
- java多线程之生产者消费者经典问题