java多线程 生产者消费者_java多线程之-生产者与消费者
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多线程之-生产者与消费者相关推荐
- java 生产者消费者_Java多线程:线程间通信—生产者消费者模型
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...
- java消费者和生产者模型_Java实现简易生产者消费者模型过程解析
一.概述 一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程.当产品没有时,通知生产者生产,生产者生产后,通知消费者消费,并等待消费者消费完. 需要注意的是,有可能出现 ...
- java 锁旗标_Java多线程
Java多线程 1. 多线程存在的意义 多线程最大的作用就是能够创建"灵活响应"的桌面程序,而编写多线程最大的困难就是不同线程之间共享资源的问题,要使这些资源不会同时被多个线程访问 ...
- java 管程通信_Java多线程07_线程通信之管程法与信号灯法
Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...
- java线程集合点_Java多线程学习笔记(三) 甚欢篇
使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...
- java线程代码实现_Java 多线程代码实现讲解
作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...
- java线程怎么用_Java多线程基本使用
一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...
- java消费者生产者设计模式_java 多线程并发设计模式之四: 生产者消费者模式
生产者消费者模式是一个经典的多线程设计模式,其核心思想是:有两类线程和一个内存缓冲区或者队列, 一类线程发起任务,并提交到队列中.另一类线程用来处理这些任务,叫做消费者线程. 这两类线程进行通信的桥梁 ...
- java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例
/**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...
最新文章
- vs打开php项目路径,如何让vscode右键项目文件夹打开
- bad geometry: block count 65536 exceeds size of device (53248 blocks)
- java ssh框架 struts spring hibernate 简介
- 【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框
- 网易实践|千万级在线直播弹幕方案
- (转)git常用命令
- JS,Jquery 调用 C#WebService
- 【图像融合】基于小波变换的图像融合
- extjs计算两个DateField所间隔的月份(天数)
- 制作win7 u盘启动盘
- 为什么要去学习函数式编程
- Regular DLL
- 【JavaWeb】JSP:基本语法大全
- python网络请求_python发送网络请求
- 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object)
- 淘宝天猫京东拼多多苏宁抖音等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)
- 源代码可以申请版权登记吗
- 移动端点击出现遮罩块效果
- 外贸客户电话和邮件地址的收集
- python3 urllib 内存泄露_【专家专栏】张昊 | 从urllib2的内存泄露看python的GC
热门文章
- sangerbox平台使用(二)差异分析
- for android 软件,安卓特工 for Android
- 高性能Linux服务器运维实战,《高性能Linux服务器构建实战》笔记
- 零基础入门学习Python(20)-lambda表达式、filter()、map() BIF
- 微生物组-扩增子16S分析第12期(报名直播课免费参加线下2021.7)
- 微生物分类学研究利器:模式微生物基因组数据库
- Nature Microbiology:火眼金睛,肠道菌群绝对定量分析擒“真凶”!
- 图之典—可视化图表的词典
- pve rust 能拆家吗_RUST:2020年9月第四周:向上向上再向上!
- R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布