生产者

 import java.util.Random;

 public class Producer extends Thread {

     private Storage<Product> storage;

     public Producer(Storage<Product> storage) {
this.storage = storage;
} @Override
public void run() {
produce();
} private void produce() {
while (true) {
Product product = new Product(new Random().nextInt(100));
storage.enStorage(product);
}
} }

消费者

 public class Consumer extends Thread {

     private Storage<Product> storage;

     public Consumer(Storage<Product> storage) {
this.storage = storage;
} @Override
public void run() {
consume();
} private void consume() {
while (true) {
storage.deStorage();
}
} }

产品

 /**
* 产品
*
* @author thief
*
*/
public class Product { private int id; public Product(int id) {
this.id = id;
} @Override
public String toString() {
return "产品:" + id;
} }

仓库

 import java.util.ArrayList;
import java.util.List; /**
* 仓库
*
* @author Thief
*
* @param <E>
*/
public class Storage<E> { private List<E> list = new ArrayList<E>(); /**
* 入仓
*
* @param e
*/
public void enStorage(E e) {
synchronized (list) {
while (this.isFull()) {
try {
System.out.println("仓库已满");
list.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
list.add(e);
System.out.println(Thread.currentThread().getName() + "生产产品");
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
list.notifyAll();
}
} /**
* 出仓
*
* @param e
*/
public E deStorage() {
synchronized (list) {
while(this.isEmpty()) {
try {
System.out.println("仓库已空");
list.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
E e = list.get(0);
list.remove(0);
System.out.println(Thread.currentThread().getName() + "消费产品");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
list.notifyAll();
return e;
}
} /**
* 判断当前仓库是否为空
*
* @return
*/
public boolean isEmpty() {
return list.isEmpty();
} /**
* 判断当前仓库是否已满
*
* @return
*/
public boolean isFull() {
return list.size() == 5;
} }

测试代码

 public class Test {

     public static void main(String[] args) {

         Storage<Product> storage = new Storage<Product>();

         new Producer(storage).start();
new Consumer(storage).start();
} }

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

  1. 结合生活,剖析《生产者消费者模型》-java多线程(一)

    博客园的园友们好,看博客园上各位大佬的文章,已陪伴了我程序员职业的三年, 如今自己同样希望能把自己从小白到菜鸟的成长过程分享给大家.不定期更新!!! 首先我本人智商不高,理解问题十分吃力,完全不属于天 ...

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

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一 ...

  3. Linux同步互斥(Peterson算法,生产者消费者模型)

    同步 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 互斥 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能. 互斥技术可以用于解决诸如资源争用之类的冲突,还可 ...

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

    4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 que ...

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

    什么是生产者-消费者模式 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相 ...

  6. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

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

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  8. Java生产者消费者模型

    在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...

  9. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...

随机推荐

  1. 【后台管理系统】—— Ant Design Pro入门学习&项目实践笔记(三)

    前言:前一篇记录了[后台管理系统]目前进展开发中遇到的一些应用点,这一篇会梳理一些自己学习Ant Design Pro源码的功能点.附:Ant Design Pro 在线预览地址. Dashboard ...

  2. IE 下 input 不响应 change 事件的处理

    很多时候,我们都需要通过 input 来上传文件,通过 change 事件获取用户上传的文件,然后做一些额外的处理,最后上传到服务器. 可是事情往往就是没有那么美好.是的,IE 下 input 在选择 ...

  3. 淘宝JAVA中间件Diamond详解(二)---原理介绍

    转:http://blog.csdn.net/anhuidelinger/article/details/70314744 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本 ...

  4. CentOS系统使用yum安装配置MariaDB数据库

    http://www.server110.com/mariadb/201310/2670.html 1.在 /etc/yum.repos.d/ 下建立 MariaDB.repo,内容如下:[azure ...

  5. Odoo8中“更多”下拉菜单选项指定后台执行代码

    在Odoo8中的仓库模块,根据每日最小安全库存数量,系统会自动生成一些补货单,而且是一个产品会生成一笔,如果产品比较多,这里生成的补货单也会很多. 如果这里的补货单没有即时处理,那相同产品后续不会再生 ...

  6. Grow heap (frag case) to 6.437MB for 1114126-byte allocation

    本篇文章是对Grow heap (frag case) 堆内存过大的问题进行了详细的分析介绍,需要的朋友参考下 对于Android开发者来说虽然使用了可以自动管理内存的Java语言,但是对于内存管理不 ...

  7. JAVA-IO操作,字节-字符转换流

    掌握OutputStreamWriter和InputStreamReader类的作用 一般操作输入输出内容的时候,就需要使用字节或字符流,但是,有些时候,需要将字符流变成字节流形式,或者字节流变成字符 ...

  8. 《让LoadRunner走下神坛》

    这几天碰到这么几件事情,觉得挺有意思的:1.        有个朋友问了我一个问题:LoadRunner的缺点在哪?然后我反问她:LoadRunner的优点在哪?她一时语塞,后来说:感觉都是优点没有什 ...

  9. JsonConvert.SerializeObject() 输出josn格式 也就是序列化。

    JsonConvert.SerializeObject() 输出josn格式  也就是序列化. JSON.parse 反序列化  http://www.cnblogs.com/ahlx/p/52280 ...

  10. JQuery选择器大全 前端面试送命题:面试题篇 对IOC和DI的通俗理解 c#中关于协变性和逆变性(又叫抗变)帮助理解

    JQuery选择器大全   jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement")    选择id值等于myElement的元素 ...