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 ...
随机推荐
- 技术分享,学术报告presentation 常用的承接句
前言 现在即使是搞技术,做科研的,也需要在不同的场合,用ppt来做分享,做汇报,做总结. 如果国际会议,研讨会,或者在外企,国外工作,英文的presentation就更加必不可少.英语的提升需要大家从 ...
- MySQL优化四(优化表结构)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- jQuery获取Select选择的Text和Value
jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...}); //为S ...
- Qt下实现简单的UDP通信
本人呢还是小实习生一枚,刚一脚踏进社会大母亲的怀抱,不想找工作的时候碰到的全是培训机构... 不过还是幸运的进了一家...咳咳,国企?!好吧,其实是国企下面的一个分出来的小公司(正在起步中,算是创业公 ...
- 队列工厂之RedisMQ
本次和大家分享的是RedisMQ队列的用法,前两篇文章队列工厂之(MSMQ)和队列工厂之RabbitMQ分别简单介绍对应队列环境的搭建和常用方法的使用,加上本篇分享的RedisMQ那么就完成了咋们队列 ...
- UWP Composition API - New FlexGrid 锁定行列
如果之前看了 UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包 这篇的童鞋,针对VS2017,需要对应更新一下配置,需要的童鞋点 ...
- LSTM基础
DNN,CNN,RNN:1.DNN:深度神经网络,或称多层感知机.解决早期单层感知机对于复杂函数不能模拟的情况.其形式为层之间全连接.实用sig等连续性函数模拟神经对机理的响应,训练算法使用 B ...
- Docker建立本地Registry
从容器运行一个Registry # docker run -p : registry 查看yelinyuntest/static_web镜像 # docker images yelinyuntest/ ...
- HTML的语义化,你需要深入了解
有关HTML的一些基础课程,很多网站都有讲,于我而言,真正实践起来,我只要求我能够让它表现出我所想要的结果即可.然而,这种要求,对于后期的维护与测试,真的是......想起日前我们所做的这个项目,那里 ...
- JQ实战一之烟花
本次的效果大概为当用户点击网页时,网页下方弹出一个类似烟花的长条条,然后在桌面上散开以达成类似烟花的特效.话不多说先上图. 首先布局,布局很简单 <style> body { backgr ...