生产者和消费者:

就犹如在快餐店点餐一样,有多个打饭的,有不定时的人来买饭,买饭的人从快餐店自动取餐,如果快餐的库存数量达到下限值时,自动启动打饭的,补充盒饭。

通过while循环的方式,传入变量isStop,来判断是否结束当前while循环。

 package jquery.test.interview;

 import java.util.Vector;

 public class Productor<T> implements Runnable {

     private volatile Vector<T> v;

     private volatile boolean flg = true;
private volatile boolean procFlg = true; public Productor(Vector<T> v){
this.v = v;
} /**
* 生产产品
* @return
*/
public void createProduct(){
synchronized(v){
while(flg){
System.out.println("库存产品数....1.." + v.size());
if((v.isEmpty() || v.size() < 3) && procFlg){
System.out.println("库存紧张,开始生产......");
v.add((T)"product1.....");
v.add((T)"product2.....");
v.add((T)"product3.....");
v.add((T)"product4.....");
v.add((T)"product5.....");
}
//开始等待
try {
System.out.println("库存产品数...2..." + v.size());
v.notifyAll();
v.wait();
} catch (InterruptedException e) {
v.notifyAll();
}
}
if(!flg){
System.out.println("-------------stop proc ---");
v.notifyAll();
}
}
} @Override
public void run() {
createProduct();
} public void stop(){
flg = false;
} public void stopProc(){
procFlg = false;
} }

Productor

 package jquery.test.interview;

 import java.util.Vector;

 public class Customer<T> implements Runnable {

     private volatile Vector<T> vector;

     private volatile boolean flag2 = true;

     public Customer(Vector<T> vector){
this.vector = vector;
} public void getProduct(){
synchronized(vector){
System.out.println("-----stop---customer--222222222-");
while(flag2){
System.out.println("-----flag2----^^^^-");
if(null == vector || vector.isEmpty()){
try {
System.out.println("--没有产品等待中.....");
vector.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("--获取产品使用....." + vector.get(0));
vector.remove(0);
vector.notify();
}
}
if(!flag2){
System.out.println("-----stop---customer---");
vector.notifyAll();
}
}
} @Override
public void run() {
getProduct();
} public void stop(){
flag2 = false;
} }

Customer

     public static void main(String[] args) throws InterruptedException, ExecutionException {
Vector<String> product = new Vector<String>();
ExecutorService pool = Executors.newCachedThreadPool();
Productor proc = new Productor(product);
pool.submit(proc);
Productor proc2 = new Productor(product);
pool.submit(proc2);
List<Customer> cusGroup = new ArrayList<Customer>();
for(int i =0;i<1;i++){
Customer cus = new Customer(product);
cusGroup.add(cus);
pool.submit(cus);
}
Thread.sleep(1000*1);
proc.stopProc(); // 终止生产
proc2.stopProc(); // 终止生产
cusGroup.forEach(cus -> cus.stop()); //关闭客户
proc.stop(); // 关闭生产者,(先关闭消费者,要不然消费者没法关闭)
proc2.stop(); // 关闭生产者,(先关闭消费者,要不然消费者没法关闭)
Thread.sleep(1000*2);
pool.shutdown();
System.out.println("-------------结束");
}

main

生产者和消费者模式--java设计模式的更多相关文章

  1. Java多线程设计模式(2)生产者与消费者模式

    1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...

  2. java生产者与消费者模式

    前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...

  3. Java并发编程(4)--生产者与消费者模式介绍

    一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...

  4. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  5. java进阶(40)--wait与notify(生产者与消费者模式)

    文档目录: 一.概念 二.wait的作用 三.notify的作用 四.生产者消费者模式 五.举例 ---------------------------------------分割线:正文------ ...

  6. 使用libuv实现生产者和消费者模式

    生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...

  7. condition版生产者与消费者模式

    1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...

  8. 【爬虫】Condition版的生产者和消费者模式

    Condition版的生产者和消费者模式 threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作 threading.Condi ...

  9. 【爬虫】Load版的生产者和消费者模式

    ''' Lock版的生产者和消费者模式 ''' import threading import random import time gMoney = 1000 # 原始金额 gLoad = thre ...

随机推荐

  1. hbase基于solr配置二级索引

    一.概述 Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase Sec ...

  2. php登陆绑定手机验证码使用阿里大于接口

    https://doc.alidayu.com/doc2/index.htm  一条0.045 元  新注册送10块 

  3. ActiveMQ消息持久化存储策略

    ActiveMQ的内核是Java编写的,也就是说如果服务端没有Java运行环境ActiveMQ是无法运行的.ActiveMQ启动时,启动脚本使用wrapper包装器来启动JVM.JVM相关的配置信息在 ...

  4. OAuth 2.0:Bearer Token、MAC Token区别

    Access Token 类型介绍 介绍两种类型的Access Token:Bearer类型和MAC类型 区别项 Bearer Token MAC Token 1 (优点) 调用简单,不需要对请求进行 ...

  5. 浅谈fhq_treap

    \(BST\) 二叉查找树,首先它是一颗二叉树,其次它里面每个点都满足以该点左儿子为根的子树里结点的值都小于自己的值,以该点右儿子为根的子树里结点的值都大于自己的值.如果不进行修改,每次查询都是\(O ...

  6. 虚拟机设置成桥接模式x86_openwrt也可以上网

    一.虚拟机桥接设置 1. 2.选择 虚拟机 >>设置 三.ip设置,要在同一网段,能够分配到路由的ip地址 1.主机ip 2.虚拟机中x86_openwrt ip 四.openwrt设置 ...

  7. [boost] : test库

    最小化的测试套件minimal_test test库提供一个最小化的测试套件minimal_test, 类似lightweight_test适合入门级测试. 需要包含文件文#include <b ...

  8. 【python】网络编程-UDP协议套接字

    服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSI ...

  9. ALGO-7_蓝桥杯_算法训练_逆序对

    出处:http://blog.csdn.net/enjoying_science/article/details/44114035 (有难度,以后回来填坑) 阅读代码中: #include<st ...

  10. jquery粘贴操作

    今天忘记记录一个点了,关于input字体默认浅色,聚焦变深的问题. 图一,默认浅色 图二,聚焦出现下拉框“最近搜索”记录,点击“程序员” 图三,input值变为“程序员”,颜色没有变深(复制粘贴也不变 ...