- 浏览: 187275 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
qq32933432:
do不dom的不重要,主要是这个表妹~~~有联系方式吗?
javascript 原生Dom对象和jQuery对象的联系和区别 -
lixin3811:
赞一个,博主,请问是否可以配置检查内容?
Nginx 使用naxsi 防xss、防注入攻击配置 -
zl378837964:
我是后台管理用户使用的,兄弟。不是一般不建议,不是想象的,而是 ...
mysql中文排序并实现仿手机通讯录 -
zl378837964:
使用Ascii码,写个算法就可以将中文转化为拼音,然后使用Ma ...
mysql中文排序并实现仿手机通讯录 -
inta:
如何区分C、D...的
mysql中文排序并实现仿手机通讯录
前段时间又回头看了看java基础的线程问题,感觉就是不一样;
容易得多,当初第一次真的搞晕人;
顺便试了一下,多生产者消费者的同步通信问题:
由生产者,消费者,仓库 三部分组成Product的处理
贴出来,交流一下。
测试了一下,还不错,控制的还好吧;
测试结果如下:
p0 生产入仓库:[1--产品]
c2 消费了产品:[1--产品]
消费者 c2 :仓库无货,请稍后再来.....
消费者 c1 :仓库无货,请稍后再来.....
p2 生产入仓库:[2--产品]
p1 生产入仓库:[3--产品]
p1 生产入仓库:[4--产品]
c0 消费了产品:[2--产品]
p1 生产入仓库:[5--产品]
p1 生产入仓库:[6--产品]
p1 生产入仓库:[7--产品]
p2 生产入仓库:[8--产品]
p2 生产入仓库:[9--产品]
p2 生产入仓库:[10--产品]
p2 生产入仓库:[11--产品]
c2 消费了产品:[3--产品]
p0 生产入仓库:[12--产品]
p0 生产入仓库:[13--产品]
生产者 p0 :仓库已满,请稍后生产.....
c2 消费了产品:[4--产品]
p2 生产入仓库:[14--产品]
生产者 p1 :仓库已满,请稍后生产.....
c0 消费了产品:[5--产品]
c0 消费了产品:[6--产品]
c0 消费了产品:[7--产品]
我以前也写过。可能是我表达不准确吧,反正就是这个意思,另一篇你看看,是否有问题?交流一下也好。
相互制约的线程控制是什么概念。。没听说过
容易得多,当初第一次真的搞晕人;
顺便试了一下,多生产者消费者的同步通信问题:
由生产者,消费者,仓库 三部分组成Product的处理
贴出来,交流一下。
package package com.pdsu.zhang.thread; import java.util.LinkedList; import java.util.Queue; class Product { // 产品 private int ID; private String name; public Product(int id, String name) { ID = id; this.name = name; } @Override public String toString() { return "["+ID+"--"+name+"]"; } } class Store { // 仓库 private final int MAX=10; private int flag=-1; Queue<Product> list =new LinkedList<Product>();// 队列 private int id=0; Product temp; synchronized void add(){ if(judge()==1){ System.out.println("生产者 "+Thread.currentThread().getName()+" :仓库已满,请稍后生产....."); try { this.wait(); //Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } }else{ temp=new Product(++id,"产品"); if(judge()==-1){ list.offer(temp); this.notify(); }else list.offer(temp); System.out.println(Thread.currentThread().getName()+" 生产入仓库:"+temp.toString()); // 不放在run{}中,否则会:先打印消费后生产! 因为print和add没有被同步; try { // 等会儿再生产,模拟生产耗时 Thread.sleep(200); } catch (InterruptedException e) {e.printStackTrace();} } } synchronized void get(){ if(judge()==-1){ System.out.println("消费者 "+Thread.currentThread().getName()+" :仓库无货,请稍后再来....."); try { this.wait(); //Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } }else{ if(judge()==1){ temp = list.poll(); this.notify(); // 不通知就会死等,死锁了 }else temp = list.poll(); System.out.println(Thread.currentThread().getName()+" 消费了产品:"+temp.toString()); // 不放在run{}中,同上: try { // 等会儿再消费,模拟消费耗时 Thread.sleep(200); } catch (InterruptedException e) {e.printStackTrace();} } } // 判断仓库的库存量 synchronized int judge(){ if(list.size()>=MAX) flag=1; else if(list.isEmpty()) flag=-1; else flag=0; return flag; } } class Producer implements Runnable { // 生产者 Store s; public Producer(Store s) { this.s = s; } public void run() { while(true){ s.add(); } } } class Customer implements Runnable{ // 消费者 Store s; public Customer(Store s) { this.s = s; } public void run() { while(true){ s.get(); } } } public class Producer_Customer { /** * @param args * @author zhangli */ public static void main(String[] args) { Store s = new Store(); Producer p= new Producer(s); Customer c= new Customer(s); Producer p1= new Producer(s); Customer c1= new Customer(s); Producer p2= new Producer(s); Customer c2= new Customer(s); new Thread(p,"p0").start(); new Thread(c,"c0").start(); new Thread(p1,"p1").start(); new Thread(c1,"c1").start(); new Thread(p2,"p2").start(); new Thread(c2,"c2").start(); } }
测试了一下,还不错,控制的还好吧;
测试结果如下:
p0 生产入仓库:[1--产品]
c2 消费了产品:[1--产品]
消费者 c2 :仓库无货,请稍后再来.....
消费者 c1 :仓库无货,请稍后再来.....
p2 生产入仓库:[2--产品]
p1 生产入仓库:[3--产品]
p1 生产入仓库:[4--产品]
c0 消费了产品:[2--产品]
p1 生产入仓库:[5--产品]
p1 生产入仓库:[6--产品]
p1 生产入仓库:[7--产品]
p2 生产入仓库:[8--产品]
p2 生产入仓库:[9--产品]
p2 生产入仓库:[10--产品]
p2 生产入仓库:[11--产品]
c2 消费了产品:[3--产品]
p0 生产入仓库:[12--产品]
p0 生产入仓库:[13--产品]
生产者 p0 :仓库已满,请稍后生产.....
c2 消费了产品:[4--产品]
p2 生产入仓库:[14--产品]
生产者 p1 :仓库已满,请稍后生产.....
c0 消费了产品:[5--产品]
c0 消费了产品:[6--产品]
c0 消费了产品:[7--产品]
评论
5 楼
zl378837964
2012-09-09
Shen.Yiyang 写道
你的两边的线程如果不工作的话,就是block(wait)吧,看不出什么制约的效果; 而且你拿数据和放数据,在一个对象上面wait/notify,实际上可能误唤醒吧;用blocking queue可能更好一点,它的实现是两个等待队列
我以前也写过。可能是我表达不准确吧,反正就是这个意思,另一篇你看看,是否有问题?交流一下也好。
4 楼
Shen.Yiyang
2012-09-06
你的两边的线程如果不工作的话,就是block(wait)吧,看不出什么制约的效果; 而且你拿数据和放数据,在一个对象上面wait/notify,实际上可能误唤醒吧;用blocking queue可能更好一点,它的实现是两个等待队列
3 楼
Shen.Yiyang
2012-09-06
zl378837964 写道
我没有用线程池,要的就是这效果,实现相互制约的线程控制啊!亲
目的不同不相语 ~ ~ ~
目的不同不相语 ~ ~ ~
相互制约的线程控制是什么概念。。没听说过
2 楼
zl378837964
2012-09-06
我没有用线程池,要的就是这效果,实现相互制约的线程控制啊!亲
目的不同不相语 ~ ~ ~
目的不同不相语 ~ ~ ~
1 楼
Shen.Yiyang
2012-09-04
生产消费模式在应对固定的吞吐量时,非常合适;但是在吞吐变化很大,线程时而空闲时而忙碌的场景下,我觉得转变思路,把生产消费的这种脚本模型 转化成 面向对象的task,用线程池是更合理,更具有维护性的做法。 一点想法,来自于前段时间有人问,怎么总结或者减少消费者之类的问题。
发表评论
-
tsar 字段含义解释
2018-05-15 11:50 0##系统模块 ###cpu ####字段含义 * ... -
RocketMQ与Kafka对比
2018-05-03 00:55 3761淘宝内部的交易系统使用了淘宝自主研发的Notif ... -
git回退到某个历史版本
2018-04-24 21:32 0github:基于master历史版本新建分支 ... -
常用ASCII/ISO-8859-1/GB2312/GBK/UTF-8等字符编码梳理
2017-09-01 15:26 2299在计算机中所有的数据在存储和计算时都以二进 ... -
Log4j 1.x版 引发线程blocked死锁问题
2017-05-10 13:42 10474Apache Log4j是一个基于Java的日 ... -
android项目 从eclipse导入Android Studio过程问题披露
2017-04-20 16:24 2751很久没有 ... -
eclipse各版本对应JDK版本要求
2017-03-20 16:04 21097最近换IDE前使用的idea,公司 ... -
Java 浮点数二进制表示原理解析
2017-03-13 01:32 0单精度浮点数的组成,一位符号位,然后八位指数位,然后23位小 ... -
new Date() 系统时间从1970年1月1日开始计算
2017-03-06 22:22 2239(有意思的冷知识) 很多程序语言里,定义time 从 ... -
升级log4j 2.x版本 缓存异步化配置解读
2017-02-27 22:07 8917转载请注明出处:http://zl378837964.i ... -
java 基础知识(注意点集合)
2017-02-16 16:15 01、重写比较方法关键点 当Object类int java. ... -
HashMap之链表导致死循环
2017-02-16 15:53 3105描述:HashMap采用拉链法(数组链表)解决Hash冲突 ... -
java 泛型之继承
2017-01-05 19:44 0Jdk1.5中支持了泛型,在泛型的使用过程中经常会遇到 ... -
java并发之锁机制 ReentrantLock和synchronized比较
2016-12-20 20:32 0如需转载请联系听云College团队成员小尹 邮箱:yinh ... -
java中经常涉及的线程同步相关
2016-12-16 20:04 0sleep和wait区别:1).sleep是T ... -
Entity实体类为什么要实现Serializable接口才能被序列化
2016-11-30 16:21 9463引起这个疑问,还是从Hibernate使用查 ... -
24设计模式 之 五项设计原则(SOLID)
2016-10-26 11:13 1955总所周知 设计模式( ... -
简单测试Jdbc批量操作对比
2012-11-01 13:57 1641总是使用框架等等,都是封装好的操作,好久没用JDBC直接操作了 ... -
用blocking queue实现生产者消费者
2012-09-09 16:23 1218就前一篇的类似操作,也是看到一篇面试题,练习了一下用block ... -
深圳公司一道面试题
2012-09-04 12:25 800前几天,在别人博客上见到一个面试题,就看看吧: ...
相关推荐
java的生产者消费者,thread生产者消费者、。。。。。。
//下面的消费者类对象和生产者类对象所操作的是同一个同步堆栈对象 Producer p1 = new Producer(stack,ce); new Thread(p1).start();//生产者线程启动 Consumer c1 = new Consumer(stack,ce); new Thread(c1)....
生产者消费者java源码, 执行生产者消费者的模式。 通过producer, consumer里面的Thread.sleep控制生产与消费的速度...
生产者消费者 java class Producter extends Thread { Queue q; Producter (Queue q) { this.q=q; } public void run() { for(int i=0;i;i++) { q.put(i); System.out.println("producter :"+i); }
//使生产者写的缓冲区可以被多个消费者使用,实现读写同步; ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL); } //消费者进程 void Consume(void * p) { //局部变量声明; DWORD wait_for_semaphore,m...
通过mfc,以动画形式,体现生产者消费者模式,包括单生产者单消费者,多生产者多消费者等,实验环境为vs2017版本,代码较多,几乎每行都有注释。适合学习。
用线程做一个生产者-消费者同步问题 其实我是想用线程做一个生产者-消费者同步问题,现在已经成功了,贴出来,大家请指证. 我想让线程thread1和thread2按顺序显示,于是加了个信号量mysem,并且在新建两个线程的两个...
生产者和消费者 ----------------------------------- 产品 核心元素 工厂 生成产品 消费产品 生产者 生成产品 消费者 消费产品 市场 操作消费者、生产者 --------------------------------- 一次性生产15个 一次性...
使用C++11中的thread库实现单生产者与单消费者的多线程问题。
有关多线程中生产者与消费者问题,本文档详细介绍了此类问题,并有详细的例子!!
生产者消费者实现代码,简单的java实现的多生产者,多消费者代码。
生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池(列表),生产者往里面放东西,消费者从里面取,规则是:列表为空的时候,生产者才能放东西;列表不为空的时候,消费者才能取东西;为了简单起见,暂定缓冲...
java线程之简单的生产者消费者代码,没有太多注释。这个是store部分,生产者消费者自己可以简单写一个。
《计算机操作系统》课程设计 题 目: 生产者---消费者问题 专 业: 软件工程 年 级: 2010级 小组成员: A B 指导教师: 时 间: 地 点: 2012年 5 月 摘要 生产者消费者问题(英语:Producer-consumer problem),...
自己用Java写的简单生产者与消费者模型
Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题。 代码如下:require “thread” puts “ProAndCon” queue = Queue.new #用队列Queue实现线程同步 producer = Thread.new do 10....
编写生产者/消费者模式的程序。生产者每隔100ms产生一个0~9之间的一个数,保存在一个MyNumber类型的对象中,并显示出来。只要这个MyNumber对象中保存了新的数字,消费者就将其取出来显示。试定义MyNumber类,编写...
java中典型的thread问题,利用同步机制,实现临界调节的锁定
Queues/Pipes/Managers进程锁进程池3、线程(thread)语法join函数daemon(守护线程)线程锁之Lock(互斥锁mutex)/RLock(递归锁)/Semaphore(信号量)EventQueue生产者消费者模型4、进程和线程的关系区别 1、Python GIL...