java多线程之-并发协作【生产者与消费者】模型

对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的。也就是可以说多线程的并发协作

对于此模型说明

1、生产者仅仅在仓库中未存贮满的时候生产,仓库满了就停止生产了。

2、消费者仅仅在仓库中有存储的产品才能消费,如果仓库为空就等待。

3、当消费者发现仓库中没有产品的时候回通知生产者进行生产

4、当生产者生产任何消费产品的时候,应该通知等待的消费者去消费。

package a;

import java.util.Queue;

import java.util.concurrent.LinkedBlockingQueue;

public class Main {

private static Queue queue = new LinkedBlockingQueue();

private final static int MAX_COUNT = 30;

private static Object lock = new Object();

/**

* 苹果产品

* @author gaoyuandong

* @date 2015年7月24日 下午4:11:37

* @mail 466862016@qq.com

*/

private static class Apple {

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Apple(String name) {

super();

this.name = name;

}

public Apple() {

super();

// TODO Auto-generated constructor stub

}

}

/***

* 消费者

* @author gaoyuandong

* @date 2015年7月24日 下午4:09:49

* @mail 466862016@qq.com

*/

private static class Customer extends Thread {

@Override

public void run() {

while (true) {

synchronized (lock) {

if(queue.isEmpty()) {

try {

System.err.println("篮子里面没有苹果了,我好饿啊,我等待....");

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

} else {

queue.poll();

System.err.println("篮子里面有苹果了,我要吃苹果.... 还剩下:" + queue.size() +"个苹果" );

lock.notifyAll();

}

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

/***

* 生产者

* @author gaoyuandong

* @date 2015年7月24日 下午4:08:58

* @mail 466862016@qq.com

*/

private static class Producer extends Thread {

@Override

public void run() {

while (true) {

synchronized (lock) {

if(queue.size() >= MAX_COUNT) {

try {

System.err.println("篮子中苹果已经放满了,我好累啊,我等待.....");

lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}else {

queue.add(new Apple("xxxx"));

System.err.println("我要往篮子里面放置苹果了.... 现在有" + queue.size() +"个苹果");

lock.notifyAll();

}

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

public static void main(String[] args) {

for (int i = 0; i < 10; i++) {

Customer customer = new Customer();

customer.start();

}

Producer producer = new Producer();

producer.start();

}

}

输出结果:

我要往篮子里面放置苹果了.... 现在有1个苹果

篮子里面有苹果了,我要吃苹果.... 还剩下:0个苹果

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

我要往篮子里面放置苹果了.... 现在有1个苹果

篮子里面有苹果了,我要吃苹果.... 还剩下:0个苹果

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

我要往篮子里面放置苹果了.... 现在有1个苹果

篮子里面有苹果了,我要吃苹果.... 还剩下:0个苹果

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

我要往篮子里面放置苹果了.... 现在有1个苹果

篮子里面有苹果了,我要吃苹果.... 还剩下:0个苹果

我要往篮子里面放置苹果了.... 现在有1个苹果

篮子里面有苹果了,我要吃苹果.... 还剩下:0个苹果

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

篮子里面没有苹果了,我好饿啊,我等待....

对于上面的代码我们可以进行优化和不足之处,你看出哪里要进行优化吗?

java多线程 生产者消费者_java多线程之-生产者与消费者相关推荐

  1. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  2. java消费者和生产者模型_Java实现简易生产者消费者模型过程解析

    一.概述 一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程.当产品没有时,通知生产者生产,生产者生产后,通知消费者消费,并等待消费者消费完. 需要注意的是,有可能出现 ...

  3. java 锁旗标_Java多线程

    Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...

  4. java 管程通信_Java多线程07_线程通信之管程法与信号灯法

    Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...

  5. java线程集合点_Java多线程学习笔记(三) 甚欢篇

    使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...

  6. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  7. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  8. java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式

    生产者消费者模式是一个经典的多线程设计模式,其核心思想是:有两类线程和一个内存缓冲区或者队列, 一类线程发起任务,并提交到队列中.另一类线程用来处理这些任务,叫做消费者线程. 这两类线程进行通信的桥梁 ...

  9. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例

    /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...

最新文章

  1. vs打开php项目路径,如何让vscode右键项目文件夹打开
  2. bad geometry: block count 65536 exceeds size of device (53248 blocks)
  3. java ssh框架 struts spring hibernate 简介
  4. 【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框
  5. 网易实践|千万级在线直播弹幕方案
  6. (转)git常用命令
  7. JS,Jquery 调用 C#WebService
  8. 【图像融合】基于小波变换的图像融合
  9. extjs计算两个DateField所间隔的月份(天数)
  10. 制作win7 u盘启动盘
  11. 为什么要去学习函数式编程
  12. Regular DLL
  13. 【JavaWeb】JSP:基本语法大全
  14. python网络请求_python发送网络请求
  15. 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object)
  16. 淘宝天猫京东拼多多苏宁抖音等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)
  17. 源代码可以申请版权登记吗
  18. 移动端点击出现遮罩块效果
  19. 外贸客户电话和邮件地址的收集
  20. python3 urllib 内存泄露_【专家专栏】张昊 | 从urllib2的内存泄露看python的GC

热门文章

  1. sangerbox平台使用(二)差异分析
  2. for android 软件,安卓特工 for Android
  3. 高性能Linux服务器运维实战,《高性能Linux服务器构建实战》笔记
  4. 零基础入门学习Python(20)-lambda表达式、filter()、map() BIF
  5. 微生物组-扩增子16S分析第12期(报名直播课免费参加线下2021.7)
  6. 微生物分类学研究利器:模式微生物基因组数据库
  7. Nature Microbiology:火眼金睛,肠道菌群绝对定量分析擒“真凶”!
  8. 图之典—可视化图表的词典
  9. pve rust 能拆家吗_RUST:2020年9月第四周:向上向上再向上!
  10. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布