生产者——消费者模型的java代码实现

生产者

 1 import java.util.Random;
 2
 3
 4 public class Producer extends Thread {
 5
 6     private Storage<Product> storage;
 7
 8     public Producer(Storage<Product> storage) {
 9         this.storage = storage;
10     }
11
12     @Override
13     public void run() {
14         produce();
15     }
16
17     private void produce() {
18         while (true) {
19             Product product = new Product(new Random().nextInt(100));
20             storage.enStorage(product);
21         }
22     }
23
24
25 }

消费者

 1 public class Consumer extends Thread {
 2
 3     private Storage<Product> storage;
 4
 5     public Consumer(Storage<Product> storage) {
 6         this.storage = storage;
 7     }
 8
 9     @Override
10     public void run() {
11         consume();
12     }
13
14     private void consume() {
15         while (true) {
16             storage.deStorage();
17         }
18     }
19
20
21 }

产品

 1 /**
 2  * 产品
 3  *
 4  * @author thief
 5  *
 6  */
 7 public class Product {
 8
 9     private int id;
10
11     public Product(int id) {
12         this.id = id;
13     }
14
15     @Override
16     public String toString() {
17         return "产品:" + id;
18     }
19
20 }

仓库

 1 import java.util.ArrayList;
 2 import java.util.List;
 3
 4 /**
 5  * 仓库
 6  *
 7  * @author Thief
 8  *
 9  * @param <E>
10  */
11 public class Storage<E> {
12
13     private List<E> list = new ArrayList<E>();
14
15     /**
16      * 入仓
17      *
18      * @param e
19      */
20     public void enStorage(E e) {
21         synchronized (list) {
22             while (this.isFull()) {
23                 try {
24                     System.out.println("仓库已满");
25                     list.wait();
26                 } catch (InterruptedException e1) {
27                     e1.printStackTrace();
28                 }
29             }
30             list.add(e);
31             System.out.println(Thread.currentThread().getName() + "生产产品");
32             try {
33                 Thread.sleep(10);
34             } catch (InterruptedException e1) {
35                 e1.printStackTrace();
36             }
37             list.notifyAll();
38         }
39     }
40
41     /**
42      * 出仓
43      *
44      * @param e
45      */
46     public E deStorage() {
47         synchronized (list) {
48             while(this.isEmpty()) {
49                 try {
50                     System.out.println("仓库已空");
51                     list.wait();
52                 } catch (InterruptedException e1) {
53                     e1.printStackTrace();
54                 }
55             }
56             E e = list.get(0);
57             list.remove(0);
58             System.out.println(Thread.currentThread().getName() + "消费产品");
59             try {
60                 Thread.sleep(1000);
61             } catch (InterruptedException e1) {
62                 e1.printStackTrace();
63             }
64             list.notifyAll();
65             return e;
66         }
67     }
68
69     /**
70      * 判断当前仓库是否为空
71      *
72      * @return
73      */
74     public boolean isEmpty() {
75         return list.isEmpty();
76     }
77
78     /**
79      * 判断当前仓库是否已满
80      *
81      * @return
82      */
83     public boolean isFull() {
84         return list.size() == 5;
85     }
86
87 }

测试代码

 1 public class Test {
 2
 3     public static void main(String[] args) {
 4
 5         Storage<Product> storage = new Storage<Product>();
 6
 7         new Producer(storage).start();
 8         new Consumer(storage).start();
 9     }
10
11 }
时间: 2024-10-12 21:32:26

生产者——消费者模型的java代码实现的相关文章

转: 【Java并发编程】之十三:生产者—消费者模型(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据"姓名--1 --> 内容--1","姓名--2--> 内容--2",消费者不断交替地取得这两组数据,这里的"姓名--1&quo

Java并发编程】之十三:生产者—消费者模型(含代码)

生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据"姓名--1 --> 内容--1","姓名--2--> 内容--2",消费者不断交替地取得这两组数据,这里的"姓名--1"和"姓名--2"模拟为数据的名称,"内容--1 "和"内容--2 &q

python2.0_s12_day9之day8遗留知识(queue队列&amp;生产者消费者模型)

4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 queue非常有用,当信息必须安全的在多个线程之间进行数据交换的时候就应该想到queue 所以,queue它能保证数据被安全的在多个线程之间进行交换,那他就是天生的线程安全. queue有那么几种: class queue.Queue(maxsize=0) # 先入先出 class queue.LifoQ

生产者-消费者 模型

一.相关概念: 同步和互斥是进程间很重要的交互模式,而生产者和消费者问题则是同步和互斥的一个经典模型. 同步是一种时序关系.如规定了进程1 处理完事情A后,进程2 才能处理事情 B,经典的同步问题是生产者和消费者间的同步. 互斥描述的是一种独占关系.如任一时刻,进城1 和进程2 中只能有一个写文件C. 生产者-消费者问题: 1.在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品

[Java并发编程实战] 阻塞队列 BlockingQueue(含代码,生产者-消费者模型)

见贤思齐焉,见不贤而内自省也.-<论语> PS: 如果觉得本文有用的话,请帮忙点赞,留言评论支持一下哦,您的支持是我最大的动力!谢谢啦~ Java5.0 增加了两种新的容器类型,它们是指:Queue 和 BlockingQueue.Queue 用来临时保存一组等待处理的元素.BlockingQueue 扩张了 Queue 接口,增加了可阻塞的插入和获取等操作. BlockingQueue 通常运用于一个线程生产对象放入队列,另一个线程从队列获取对象并消费,这是典型的生产者消费者模型. 这里写图

生产者消费者模型-Java代码实现

什么是生产者-消费者模式 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相当于消费者,生产者消费者要解决的问题就是如何处理公共资源. 生产者-消费者模式的特点 保证生产者不会在缓冲区满的时候继续向缓冲区放入数据,而消费者也不会在缓冲区空的时候,消耗数据 当缓冲区满的时候,生产者会进入休眠状态,当下次消费者开始消耗缓冲区的数据时,生产者才会被唤醒,开始往缓冲区中添加数据:当

Java多线程之~~~~使用wait和notify实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满 的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就 涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候 让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作,下面我们用实际的代码来展示如何使用wait和 notify来实现生产者消费者这个经典的模型. 首先是

Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型

Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移除元素的.在FIFO队列中,所有新元素都插入队列的末尾. Queue中的方法 Queue中的方法不难理解,6个,每2对是一个也就是总共3对.看一下JDK API就知道了: 注意一点就好,Queue通常不允许插入Null,尽管某些实现(比如LinkedList)是允许的,但是也不建议. Blockin

Java线程:并发协作-生产者消费者模型

对于多线程程序来说,不管任何编程语言,生产者消费者模型都是最经典的. 实际上,准确的说应该是"生产者-消费者-仓储"模型,离开了仓储,生产者消费者模型就显得没有说服力了. 对于此模型,应该明确以下几点: 生产者仅仅在仓储未满时候生产,仓满则停止生产. 消费者仅仅在仓储有产品时候才能消费,仓空则等待. 当消费者发现仓储没有产品的时候会通知生产者生产. 生产者在生产出可消费产品时候,应该通知消费者去消费. 此模型将要结合java.lang.Object的wait与notify,notify