Java线程(学习整理)--4---一个简单的生产者、消费者模型
1、简单的小例子:
下面这个例子主要观察的是:
一个对象的wait()和notify()使用情况!
当一个对象调用了wait(),那么当前掌握该对象锁标记的线程,就会让出CPU的使用权,转而进入该对象的等待池中等待唤醒,这里说明一下,每一个对象都有一个独立的等待池和锁池!
等待池:上述的wait()后的线程会进入等待池中,处于下图线程声明周期(简单示意图)
中的这个状态,等待池中的线程任然具有对象的锁标记,但是处于休眠状态,不是可运行状态!
当该对象调用notify方法之后,就会在等待池中系统会选择一个线程被唤醒,等待队列中的这个线程释放,此线程进入锁池状态。被唤醒的线程就会转换状态,
从等待的休眠状态--->可运行状态,借着参与CPU的使用权的争夺!
package cn.sxt.runnables; import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;
/**
* 简单的生产者和消费者模型:
* @author 小风微灵
*
*/ /**
* 产品类
* @author 小风微灵
*
*/
class Product{ String name; //名称 float price; //价格 boolean isTrue=false;// 是否开始生产 }
/**
* 生产者类
* @author 小风微灵
*
*/
class Sale extends Thread{ private Product p=null; public Sale(Product p){
this.p=p;
} public void run() {
int i=0;
while(true){
synchronized (p) {
if(p.isTrue==false){ if(i%2==0){
p.name="西红柿";
p.price=4;
System.out.println("生产者生产了:西红柿,价格:4¥");
}else{
p.name="黄瓜";
p.price=2.5f;
System.out.println("生产者生产了:黄瓜,价格:2.5¥");
}
p.isTrue=true;
i++; }else{
try {
p.wait(); //生产暂停,开始消费
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
} } class Custom extends Thread{
private Product p=null; public Custom(Product p){
this.p=p;
} public void run() { while(true){
synchronized (p) {
if(p.isTrue){ System.out.println("消费者生产了:"+p.name+",价格:"+p.price+"¥"); p.isTrue=false;
}else{
p.notify(); //消费暂停,开始生产
}
}
}
}
} public class Producer_Custom { public static void main(String[] args) { Product p=new Product(); Sale sale=new Sale(p);
sale.start();
Custom custom=new Custom(p);
custom.start();
} }
运行结果:
生产者生产了:西红柿,价格:4¥
消费者生产了:西红柿,价格:4.0¥
生产者生产了:黄瓜,价格:2.5¥
消费者生产了:黄瓜,价格:2.5¥
生产者生产了:西红柿,价格:4¥
消费者生产了:西红柿,价格:4.0¥
Java线程(学习整理)--4---一个简单的生产者、消费者模型的更多相关文章
- 使用队列queue实现一个简单的生产者消费者模型
一.生产者消费者模型 我们去超市商店等地购买商品时,我们大部分人都会说自己是消费者,而超市的各大供货商.工厂等,自然而然地也就成了我们的生产者.如此一来,生产者有了,消费者也有了,那么将二者联系起来的 ...
- Python-生成器实现简单的"生产者消费者"模型
一.使用生成器实现简单的生产者消费者模型, 1.效果截屏 代码如下: import time def consumer(name): print('%s 开始买手机' %name) while Tru ...
- day34 python学习 守护进程,线程,互斥锁,信号量,生产者消费者模型,
六 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完 ...
- 多线程学习-基础(十二)生产者消费者模型:wait(),sleep(),notify()实现
一.多线程模型一:生产者消费者模型 (1)模型图:(从网上找的图,清晰明了) (2)生产者消费者模型原理说明: 这个模型核心是围绕着一个“仓库”的概念,生产者消费者都是围绕着:“仓库”来进行操作, ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- Java多线程(十):BlockingQueue实现生产者消费者模型
BlockingQueue BlockingQueue.解决了多线程中,如何高效安全"传输"数据的问题.程序员无需关心什么时候阻塞线程,什么时候唤醒线程,该唤醒哪个线程. 方法介绍 ...
- Java线程学习笔记(一个)
一个.正在创建的线程: 老掉牙的话题了.继承 java.lang.Thread父类或者实现Runnalbe接口.这里就提一句: class Thread implements Runnable Thr ...
- Java多线程学习——wait方法(管道法/生产者消费者模式)
简单介绍管道法: 生产者生产数据输送到管道,消费者从管道拿出数据,管道为空消费者等待,管道满生产者生产,消费者消费生产者生产,生产者生产消费者消费. public class Corn { //要生产 ...
- Java多线程学习——wait方法(信号灯法/生产者消费者模式)
信号灯法:以一个标志位来判断是否执行还是等待 public class TV { private String voice; //内容 private boolean flag=false; //信号 ...
- Java 实现生产者 – 消费者模型
转自:http://www.importnew.com/27063.html 考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题.有如下几个考点: 对Java并发模型的理解 对Java ...
随机推荐
- 【HDOJ】3308 LCIS
线段树,题目感觉比较难,看别人思路做的.还得继续练这个专题. #include <iostream> #include <cstdio> #include <cstrin ...
- SD卡中FAT32文件格式快速入门(图文详细介绍)
说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...
- java生成随机整数
1. 使用Random类的nextInt方法: Random rand = new Random(); rand.nextInt(max);, 此时输出[0,max),注意右边是开区间,如果需要设定最 ...
- Myeclipse 保存jsp异常Save FailedCompilation unit name must end with .java, or one of the registered Java-like extensions
如图 解决方法:去掉jsp页面的调试断点
- 用Delphi7开发Web Service程序 转
转:http://rosehacker.blog.51cto.com/2528968/450160 用Delphi7开发Web Service程序,并把服务程序放在IIS Web服务器上提供给 ...
- HDU-2149 Public Sale
http://acm.hdu.edu.cn/showproblem.php?pid=2149 巴什博奕(Bash Game): Public Sale Time Limit: 1000/1000 MS ...
- Linux下的各种软件安装方法汇总
1 RPM包 1.1 安装 RPM包就像Windows的EXE安装文件一样,各种文件都已经编译好了,并进行了打包,哪一个文件应该放在哪一个目录下都指定好了,安装非常方便,在图形界面里你只需要双击就能自 ...
- Windows玩转Docker(二):运行whalesay image
docker官网site:http://www.docker.com/ 参照site:https://docs.docker.com/windows/step_three/ docker安装参照: h ...
- poj 1011 搜索减枝
题目链接:http://poj.org/problem?id=1011 #include<cstdio> #include<cstring> #include<algor ...
- linux平台MongoDB数据库安装
跟Ruiy哥一起玩转吧; <一,初始化玩转MongoDB> 1,关闭SElinux(Ruiy哥根据经验知红帽的SElinux架设就是个错误,还记得不管啥结构首先要关闭的就是它); 2,设置 ...