生产者

 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. 在windows下部署laravel项目的步骤

    laravel版本:5.4 php版本:7.1以上,我用的php7.2.7 1.代码库下载laravel源码,放在你自己的运行目录下 2.配置hosts域名及 apache域名配置 3.安装compo ...

  2. POJ 3083:Children of the Candy Corn(DFS+BFS)

    Children of the Candy Corn Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9311 Accepted: ...

  3. C++ 字符串转化成浮点型

    第一种: char  szString[] = "3.1415926535898"; double db1; db1 = atof(szString); printf(" ...

  4. REDIS 内存满时删除策略

    REDIS 内存满时删除策略

  5. 使用SAS令牌连接Azure EventHub

    概述 事件中心使用在命名空间和事件中心级别提供的共享访问签名.SAS令牌是从SAS密钥生成的,它是以特定格式编码的URL的SHA哈希. 事件中心可以使用密钥(策略)的名称和令牌重新生成哈希,以便对发送 ...

  6. mvc模型绑定问题

    public void AddDesk(x_s_desk x_s_desk) 绑定的到 public void AddDesk(x_s_desk desk) 绑定不到 目前不知道原因 且仅有部分模型需 ...

  7. Android startActivities()的使用

    startActivities()和startActivity类似,也是界面跳转: Intent[] intents = new Intent[2]; intents[0] = new Intent( ...

  8. redis主从持久化讨论

    Redis有两种持久化方式,AOF和RDB,AOF持久化是指追加写命令到aof文件的方式,RDB是指定期保存内存快照到rdb文件的方式. RDB虽然可以通过bgsave指令后台保存快照,但fork() ...

  9. 解决WSDL.EXE不能解析外部Import的XSD的问题

    今天碰到一个WSDL,比较奇怪,它是用Java生成的. <types>   <xsd:schema>     <xsd:import namespace="ht ...

  10. Python模块学习之fabric

    fabric是一个运维经常使用到的一个模块.但是我在python3环境下安装fabric就遇到了坑! 安装包名称是fabric3而不是fabric! pip install fabric3 利用fab ...