java线程通讯之生产者消费者模式
java线程通讯之生产者消费者模式
生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。
一个生产和消费商品的例子(java)
package a;
import java.util.Random;
class Goods{
public String name;
public int price;
@Override
public String toString() {
return name+":"+price;
}
}
class Hamburger extends Goods{
public Hamburger(String name,int price) {
this.price=price;
this.name=name;
}
}
class Pizza extends Goods{
public Pizza(String name,int price) {
this.price=price;
this.name=name;
}
}
/**
* 相当于一个生产机器(生产和消费交替执行)
*/
class Model{
private Goods g;
public synchronized Goods make() throws InterruptedException {
if(g!=null) {
this.wait();
}
if(new Random().nextInt(100)%2==0) {
g=new Hamburger("汉堡",100);
}else {
g=new Pizza("披萨",200);
}
System.out.println("生产-->"+g);
this.notify();
return g;
}
public synchronized Goods buy() throws InterruptedException {
if(g==null) {
this.wait();
}
Goods gl=g;
System.out.println("消费-->"+g);
g=null;
this.notify();
return gl;
}
}
/**
* 生产者
*/
class Producer extends Thread{
public Producer(Model m) {
this.m=m;
}
private Model m;
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++) {
try {
m.make();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 消费者
*/
class Consumer extends Thread{
public Consumer(Model m) {
this.m=m;
}
private Model m;
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++) {
try {
m.buy();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class A5 {
public static void main(String[] args) {
Model m=new Model();
Producer p=new Producer(m);
p.start();
Consumer c=new Consumer(m);
c.start();
}
}
评论区
请写下您的评论...
猜你喜欢
blog
java阻塞队列实现 生产者消费者 模型
数据结构与算法
1574
在生产中我们可能会遇到在处理正常业务的过程中,其中会夹杂着一些非必需或不是特别重要的业务,而且这些业务还比较耗时,这个时候为了不影响正常业务性能,我们可以这些不是特别重要而且还比较耗时的业务独立出来
blog
线程之间的通讯
java基础
3289
1.什么是线程通信线程之间通信的两个基本问题是互斥和同步。线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒
java基础
1896
1.先看一下线程的生命周期转换图(学java的此图必背)本篇文章的主要目的不是分析线程的各种状态之间的转换,而主要是研究一下线程之间的通讯机制,以及Object的wait方法和notify方法。所以
official
1266
上一篇文章《(mq)rabbitmq消息发送确认》介绍了消息发布时的确认方案,本篇文章将介绍,消息消费确认的方法。和确认发布一样,消费者有时也需要确认,rabbitmq有三种确认模式
blog
阻塞队列及其原理
java基础
4400
待队列变为非空。2.阻塞队列的应用场景:阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。3
java虚拟机(jvm)
1688
硬件的效率与一致性在正式讲解Java虚拟机并发相关的知识之前,我们先花费一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机
blog
java启动线程的两种方式
java基础
4695
java启动线程的三种方式1.继承Thread类,重写run方法,调用start方法启动线程2.实现Runnable接口,重写run方法,调用start方法启动线程3.实现Callable接口代码如
blog
守护线程
java基础
2063
Java分为两种线程:用户线程和守护线程所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。