生产者和消费者模式--java设计模式
生产者和消费者:
就犹如在快餐店点餐一样,有多个打饭的,有不定时的人来买饭,买饭的人从快餐店自动取餐,如果快餐的库存数量达到下限值时,自动启动打饭的,补充盒饭。
通过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设计模式的更多相关文章
- Java多线程设计模式(2)生产者与消费者模式
1 Producer-Consumer Pattern Producer-Consumer Pattern主要就是在生产者与消费者之间建立一个“桥梁参与者”,用来解决生产者线程与消费者线程之间速度的不 ...
- java生产者与消费者模式
前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...
- Java并发编程(4)--生产者与消费者模式介绍
一.前言 这种模式在生活是最常见的,那么它的场景是什么样的呢? 下面是我假象的,假设有一个仓库,仓库有一个生产者和一个消费者,消费者过来消费的时候会检测仓库中是否有库存,如果没有了则等待生产,如果有就 ...
- java 线程并发(生产者、消费者模式)
线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...
- java进阶(40)--wait与notify(生产者与消费者模式)
文档目录: 一.概念 二.wait的作用 三.notify的作用 四.生产者消费者模式 五.举例 ---------------------------------------分割线:正文------ ...
- 使用libuv实现生产者和消费者模式
生产者和消费者模式(Consumer + Producer model) 用于把耗时操作(生产线程),分配给一个或者多个额外线程执行(消费线程),从而提高生产线程的响应速度(并发能力) 定义 type ...
- condition版生产者与消费者模式
1.简介 在爬虫中,生产者与消费者模式是经常用到的.我能想到的比较好的办法是使用redis或者mongodb数据库构造生产者消费者模型.如果直接起线程进行构造生产者消费者模型,线程容易假死,也难以构造 ...
- 【爬虫】Condition版的生产者和消费者模式
Condition版的生产者和消费者模式 threading.Condition 在没有数据的时候处于阻塞状态,有数据可以使用notify的函数通知等等待状态的线程运作 threading.Condi ...
- 【爬虫】Load版的生产者和消费者模式
''' Lock版的生产者和消费者模式 ''' import threading import random import time gMoney = 1000 # 原始金额 gLoad = thre ...
随机推荐
- vulcanjs 核心架构概念
基于包的架构 为了保证系统的灵活以及可扩展,vulcanjs 使用基于包的架构设计,每一个功能都是一个包,可以方便的添加,移除 扩展.而不是修改 vulcan 的设计哲学是进行系统扩展,而不是编辑修改 ...
- Thread.currentThread()与this的区别
Thread.currentThread()与this的区别: Thread.currentThread()方法返回的是对当前正在执行的线程对象的引用,this代表的是当前调用它所在函数所属的对象的引 ...
- windows server 2008 R2 无法启用"网络发现" 需要启动的服务
必须打开以下服务: 1.dnscache(简写.fdrespub(简写) 2.SSDP Discovery 3. UPnP Device Host 4. Computer Browser 5.Serv ...
- 大快搜索DKhadoop集群管理平台添加节点的步骤说明
Hadoop作为搭建大数据处理平台的重要“基石”,关于它的分析和讲解的文章已经有很多了.Hadoop本身是一分布式的系统,因此在安装的时候,需要多每一个节点进行组建的安装.并且由于是开源软件,其安装过 ...
- 【jmeter】jmeter之-断言和检查点
断言就类似LoadRunner中的检查点.对上一个请求返回的信息,做字符串.数据包大小.HTML.XML.图片等做判断,确保返回的信息的准确性. 简单的来理解一下,上一章讲到,我们对用户名和密码进行了 ...
- 【selenium】XPATH语法(一)
XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. 我们将在下面的例子中使用这个 XML 文档. <?xml v ...
- javadoc 文档
Java 文档 // 注释一行/* ...... */ 注释若干行/** ...... */ 注释若干行,并写入 javadoc 文档 通常这种注释的多行写法如下: /*** .........* . ...
- Delphi控件备份工具
用途: 1.如果您需要重装Delphi,想省去重装控件的麻烦. 2.如果您把Delphi环境安装至另一台电脑上. 那么,您一定需要这个! 运行批处理后,自动在当前目录下生成备份目录. 批处理代码 @e ...
- java操作Excel之POI(4)利用POI实现数据的批量导出
后台导出方法: /** * 后台导出方法 * 利用POI实现数据的批量导出 */ public String export() throws Exception{ Connection con = n ...
- C++基本规则
C++ 程序结构 让我们看一段简单的代码,可以输出单词 Hello World. #include <iostream> using namespace std; // main() 是程 ...