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 ...
随机推荐
- 演示:纯CSS实现自适应布局表格
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- codeforces #268 div2 D
对于这道题第一感觉是图论相关然后我们先分析,假设a[i]在A集合需要的元素是a[x],在B集合是a[y]那么假设a[i]在A集合,那必然a[x]也必须在A集合,由于a[y]如果在B集合就没有对应元素, ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- 【转】Android--多线程之Handler--不错
原文网址:http://www.cnblogs.com/plokmju/p/android_handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了 ...
- web.xml中的contextConfigLocation的作用
在web.xml中通过contextConfigLocation配置spring,contextConfigLocation 参数定义了要装入的 Spring 配置文件. 如果想装入多个配置文件,可以 ...
- 如何优雅的输出PHP调试信息
经常因为出现紧急bug而被老板骂的同事,为了更快的修复而直接利用线上的错误环境现场debug,并直接在页面上echo和dump.结果被老板发现了,又是一通臭骂.那么有没有什么办法更优雅的输出PHP调试 ...
- 让nginx支持文件上传的几种模式
文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还有用 .net 来实现, jsp来实现, 都是处理表单.只有语言的差别, ...
- 4 hbase表结构 + hbase集群架构及表存储机制
本博文的主要内容有 .hbase读取数据过程 .HBase表结构 .附带PPT http://hbase.apache.org/ 读写的时候,就需要用hbase了,换句话说,就是读写的时候. ...
- Django教程:第一个Django应用程序(4)
Django教程:第一个Django应用程序(4) 2013-10-09 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...
- orace owi介绍
第1章 OWI介绍记录和观察进程所经历的等待现象的功能和界面以及方法论,统称为OWI,也就是Oracle Wait Interface.等待事件的P1.P2.P3值可以通过v$session_wait ...