- 浏览: 189696 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 3812淘宝内部的交易系统使用了淘宝自主研发的Notif ... -
git回退到某个历史版本
2018-04-24 21:32 0github:基于master历史版本新建分支 ... -
常用ASCII/ISO-8859-1/GB2312/GBK/UTF-8等字符编码梳理
2017-09-01 15:26 2379在计算机中所有的数据在存储和计算时都以二进 ... -
Log4j 1.x版 引发线程blocked死锁问题
2017-05-10 13:42 10661Apache Log4j是一个基于Java的日 ... -
android项目 从eclipse导入Android Studio过程问题披露
2017-04-20 16:24 2800很久没有 ... -
eclipse各版本对应JDK版本要求
2017-03-20 16:04 21404最近换IDE前使用的idea,公司 ... -
Java 浮点数二进制表示原理解析
2017-03-13 01:32 0单精度浮点数的组成,一位符号位,然后八位指数位,然后23位小 ... -
new Date() 系统时间从1970年1月1日开始计算
2017-03-06 22:22 2328(有意思的冷知识) 很多程序语言里,定义time 从 ... -
升级log4j 2.x版本 缓存异步化配置解读
2017-02-27 22:07 9028转载请注明出处:http://zl378837964.i ... -
java 基础知识(注意点集合)
2017-02-16 16:15 01、重写比较方法关键点 当Object类int java. ... -
HashMap之链表导致死循环
2017-02-16 15:53 3138描述: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 9510引起这个疑问,还是从Hibernate使用查 ... -
24设计模式 之 五项设计原则(SOLID)
2016-10-26 11:13 2006总所周知 设计模式( ... -
简单测试Jdbc批量操作对比
2012-11-01 13:57 1682总是使用框架等等,都是封装好的操作,好久没用JDBC直接操作了 ... -
用blocking queue实现生产者消费者
2012-09-09 16:23 1264就前一篇的类似操作,也是看到一篇面试题,练习了一下用block ... -
深圳公司一道面试题
2012-09-04 12:25 830前几天,在别人博客上见到一个面试题,就看看吧: ...
相关推荐
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步和异步操作。在C++中,我们可以利用标准库中的互斥量(mutex)、条件变量(condition_variable)等工具来实现这个问题...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过共享资源在并发环境中实现线程间的协调。在这个问题中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。MFC(Microsoft Foundation ...
Java生产者消费者问题是多线程编程中的一个经典案例,它主要展示了如何通过共享资源来实现线程间的协作。这个问题源于现实生活中的生产流水线,其中生产者负责制造产品,而消费者负责消耗这些产品。在计算机系统中,...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来实现高效的数据处理。在Java中,我们通常会利用并发库来解决这类问题,其中包括线程池和阻塞队列等机制。 生产者消费者模型主要包括...
在多线程环境中,生产者消费者模型和读者写者问题是经典的并发控制问题,它们都涉及到资源共享与同步。本主题将深入探讨如何使用编程来解决这两个问题。 首先,生产者消费者问题是多线程并发控制中的一个经典例子。...
生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库(<thread>)、互斥量()、条件...
《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...
7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...
操作系统中的生产者-消费者问题是多线程编程中的经典案例,主要用来展示线程同步和通信的概念。在这个Java实现中,我们将深入理解这个问题的背景、原理以及如何通过Java的并发工具来解决。 生产者-消费者问题的基本...
4. **多线程技术**: 使用`Thread`类或者`Runnable`接口创建生产者和消费者线程。生产者和消费者在各自的线程中运行,通过调用`BlockingQueue`的`put`和`take`方法进行交互。 5. **死锁避免**: 在实现生产者-消费者...
为了确保数据的正确性以及系统的高效运行,必须在生产者与消费者之间建立一种有效的同步机制,以避免数据冲突或资源竞争等问题。 ##### 2.2 应用场景 生产者与消费者模型可以应用于多种场景: - **多线程程序**:...
6. **示例代码**:一个简单的生产者消费者实现可能会包含两个线程,一个生产者线程负责将数据放入队列,一个消费者线程负责从队列中取出数据。每个线程都会在适当的时机调用`wait()`和`notify()`或`notifyAll()`来...
生产者消费者问题是多线程编程中的经典模型,用于展示如何有效地在并发环境下共享资源。这个问题源于现实世界的仓库模型,其中生产者负责生产商品,而消费者则负责消费这些商品。仓库作为一个缓冲区,存储有限的商品...
生产者消费者问题是多线程编程中的一个经典案例,主要探讨如何在并发环境下高效且安全地共享有限资源。在这个问题中,我们通常有两类线程:生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了解决线程间...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...
生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。Java语言提供了丰富的工具来解决...
在解压缩后的"proandcom"文件中,可能包含了进一步的代码示例或详细的解释,你可以查看这些文件以加深对生产者消费者问题的理解。同时,为了优化性能和避免死锁,编写多线程程序时,需要遵循良好的设计原则,例如...