java多线程-消费者和生产者模式
/*
* 多线程-消费者和生产者模式
* 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象
* */
/*资源类中定义了name(名字):用来区分消费者还是生产者
* 定义了flag标记:用来区分有没有货物(默认生产一个就要消费一个)
* 定义了count(生产的个数统计)
* set方法:用来生产商品
* out方法:用来消费商品*/
class TestSource{
private String name=null;
private boolean flag=false;
private int count=0;
/*先通过flag标记判断有没有商品,有商品则等待,没有则生产商品,唤醒所有程序,并将flag标记改变*/
public synchronized void set(String name){
//判断是否有产品,这里用while循环,避免在多个生产者同时生产时,会出现生产多个产品,却只消费一个
while(flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//生产产品并输出
this.name=name+"编号"+count++;
System.out.println("生产"+name+"++");
//改变标记
flag=true;
//唤醒所有的线程
notifyAll();
}
public synchronized void out(){
while(!flag){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费"+name+"---");
flag=false;
notifyAll();
}
}
class Product implements Runnable{
private TestSource ts=null;
//初始化线程里用到的资源
public Product(TestSource ts){
this.ts=ts;
}
//重写线程里run方法
public void run() {
while(true){
ts.set("生产产品");
}
}
}
class Customer implements Runnable{
private TestSource ts=null;
public Customer(TestSource ts){
this.ts=ts;
}
public void run() {
while(true){
ts.out();
}
}
}
public class test {
public static void main(String[] args) {
//初始化唯一的资源
TestSource ts=new TestSource();
//创建生产者和消费者两个对象,并传入两者共同操作的唯一资源
Customer cu=new Customer(ts);
Product pr=new Product(ts);
//将对象传入线程对象
Thread t1=new Thread(cu);
Thread t2=new Thread(pr);
Thread t3=new Thread(cu);
Thread t4=new Thread(pr);
//开启线程
t1.start();
t2.start();
t3.start();
t4.start();
}
}
/*在java1.5版本以后,用lock和unlick代替了synchronized关键字
* 用await()代替了wait()方法
* 用signal()代替了notify()
* 这里的signal可以指定唤醒莫一类的线程,而不是像notifyAll,必须全部唤醒
这里我们对上面的代码进行一定的改写*/
class TestSource{
private String name=null;
private boolean flag=false;
private int count=0;
//定义lock,用来代替synchronized关键字
private Lock lock=new ReentrantLock();
private Condition condition_pro=lock.newCondition();
private Condition condition_con=lock.newCondition();
public void set(String name){
//对代码段进行上锁
lock.lock();
try {
while(flag){
try {
//wait();
//调用生产者控制方法
condition_pro.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.name=name+"编号"+count++;
System.out.println("生产"+name+"++");
flag=true;
//notifyAll();
//唤醒消费者线程
condition_con.signal();
} finally{
//解锁,让其他进程进入访问
lock.unlock();
} }
public void out(){
lock.lock();
try{
while(!flag){
try {
//wait();
condition_con.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费"+name+"---");
flag=false;
//notifyAll();
condition_pro.signal();
}finally{
lock.unlock();
} }
}
java多线程-消费者和生产者模式的更多相关文章
- Java多线程消费者、生产者的基本思路
多线程主要考察的就是 线程的同步控制 生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了 ThreadOne.ThreadTwo同时运行,添加一个变量在一个公共类(下边的Funct ...
- java并发:初探消费者和生产者模式
消费者和生产者模式 用继承Thread方式,用wait和notifyAll方法实现. 消费者和生产者模式的特点 1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格)
一.springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格) 1.实现简单的消费者和生产者 springcloud使用的http协议进行传输数据,也就是说springclo ...
- java 多线程 22 :生产者/消费者模式 进阶 利用await()/signal()实现
java多线程15 :wait()和notify() 的生产者/消费者模式 在这一章已经实现了 wait/notify 生产消费模型 利用await()/signal()实现生产者和消费者模型 一样 ...
- JAVA多线程经典问题 -- 生产者 消费者
工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...
- Java多线程-并发协作(生产者消费者模型)
对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓 ...
- Java多线程与并发——生产者与消费者应用案例
多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Admin ...
随机推荐
- 从depth buffer中构建view-space position
观察透视投影矩阵: 对于x和y,矩阵变换只是一个缩放系数,那么逆变换就是缩放系数的倒数,所以 设Xndc Yndc为NDC空间中的XY坐标,Xview Yview Zview为view space中的 ...
- 1787: [Ahoi2008]Meet 紧急集合
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1482 Solved: 652[Submit][ ...
- 算法模板——Tarjan强连通分量
功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...
- Html +++++css总结
一. Html部分 Html定义 Hyper Text Markup Language 超文本标记语言 html 1.0 -> html 2.0 -> ... -> ht ...
- ZooKeeper的简单理解
1 ZooKeeper的一致性特点 概念 描述 备注 顺序一致性 以ZXID来保证事务的顺序性 原子性 以ZAB保证原子操作,要么成功,要么失败 单一视图 无论客户端从哪个服务器获取到关于应用的数据都 ...
- 解决error104 connection reset by peer;socket error问题
这个问题原因有两个: 1.因为你访问网站太多次,所以被网站管理员给禁止访问了. 解决方法: 1.延长time.sleep时间 2.设置代理 2.根本没有这个网站.(打开链接检查一下!!!)
- Android使用Aspectj
使用AspectJ 集成步骤: 1.AS配置Aspectj环境 2.配置使用ajc编译 4.定义注解 5.配置规则 6.使用 7.注意事项 AS配置Aspectj环境.Aspect目前最新版本为 1. ...
- 一文让你从此告别HTTP乱码(一)Request篇
#circle { background-color: #8fcbec; border: 3px } 概述 开发Web项目的过程中,经常遇到浏览器中显示的内容乱码,或者服务器获取浏览器请求参数时乱码的 ...
- iOS开发之Copy & MutableCopy及深复制 & 浅复制
1.使用copy或mutableCopy方法可以创建一个对象的副本. copy: (1)需要实现NSCoppying协议 (2)创建的是不可变副本(如NSString.NSArray.NSDictio ...
- django出现__init__() got an unexpected keyword argument 'mimetype‘ 问题解决
这种问题好多新手按照djangobook学习的时候应该都遇到过,是因为这是老的django的写法,新的django已经升级改变了很多东西. 处理方法如下: I think you are not us ...