Java生产者消费者模式实例分析
作者:Bug开发攻城狮 时间:2023-12-13 02:12:59
本文实例讲述了Java生产者消费者模式。分享给大家供大家参考,具体如下:
java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存。
这么做有什么好处呢?
1.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费者的代码也需要随之变动
2.高效,如果消费者直接掉生产者,执行时间较长的话,会阻塞,影响其他业务的进行
3.负载均衡,如果消费者直接调生产者,那生产者和消费者就得在一起了,日后业务量非常大的话,要想减轻服务器的压力,想拆分生产和消费,就很困难
/**
* 我是生产者,负责生产
*/
public class Product implements Runnable {
private Queue q;
public Product(Queue q) {
this.q = q;
}
@Override
public void run() {
try {
for (int i = 0; i < 3; i++) {
q.product("test" + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
*我是消费者,负责消费
*/
public class Consumer implements Runnable {
private Queue q;
public Consumer(Queue q){
this.q = q;
}
@Override
public void run() {
try {
for(int i=0 ; i < 3 ; i++){
q.consumer();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
*
*我是缓存,负责产品的存(生产后的放置)取(消费时的获取)
*/
public class Queue {
private final Object lock = new Object();
private List<String> list = new ArrayList<String>();
public void product(String param) throws InterruptedException {
synchronized (lock) {
System.out.println("product生产");
list.add(param);
lock.notify();
lock.wait();
}
}
public void consumer() throws InterruptedException {
synchronized (lock) {
lock.wait();
System.out.println("product消费");
if (list.size() > 0) {
list.remove(list.size() - 1);
}
lock.notify();
}
}
}
public class TestMain {
public static void main(String[] args) {
Queue q = new Queue();
Product p = new Product(q);
Consumer s = new Consumer(q);
Thread t1 = new Thread(p);
Thread t2 = new Thread(s);
t1.start();
t2.start();
}
}
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/zy_281870667/article/details/70853474
标签:Java,生产者消费者模式
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringBoot 整合 Shiro 密码登录的实现代码
2023-11-10 11:27:59
Android开发中自定义 editText下划线
2023-03-30 13:40:35
![](https://img.aspxhome.com/file/2023/6/118956_0s.png)
Java类和成员上的一些方法实例代码
2022-03-15 10:47:31
mybatis错误之in查询 <foreach>循环问题
2023-11-17 01:10:09
浅谈spring方法级参数校验(@Validated)
2021-06-25 00:43:25
![](https://img.aspxhome.com/file/2023/7/90037_0s.png)
C#获取U盘序列号的方法
2023-09-15 02:09:54
C#实现简单文本编辑器
2022-04-28 06:42:30
![](https://img.aspxhome.com/file/2023/5/84405_0s.png)
C#中ref关键字的用法
2022-07-17 21:30:47
![](https://img.aspxhome.com/file/2023/5/125985_0s.png)
关于gradle你应该知道的一些小事
2021-09-15 10:26:35
Java杂谈之重复代码是什么
2022-06-08 15:07:24
Java中的final关键字详解及实例
2023-05-26 11:09:46
![](https://img.aspxhome.com/file/2023/0/138350_0s.png)
Java%(取模运算)全面讲解
2022-03-02 06:11:34
实例分析java中重载与重写的区别
2021-09-11 01:49:38
深入探究Java线程与进程有哪些区别
2023-05-06 13:26:03
![](https://img.aspxhome.com/file/2023/3/92543_0s.png)
Android自定义短信验证码组件
2022-10-06 00:30:13
![](https://img.aspxhome.com/file/2023/8/109148_0s.jpg)
浅谈HTTP使用BASIC认证的原理及实现方法
2021-07-18 01:36:16
C#使用JArray和JObject封装JSON对象
2022-10-15 16:56:16
![](https://img.aspxhome.com/file/2023/8/77238_0s.png)
Android崩溃异常捕获方法
2022-08-24 08:26:12
Android实现EventBus登录界面与传值(粘性事件)
2023-11-08 00:34:52
![](https://img.aspxhome.com/file/2023/7/129037_0s.gif)
Go Java算法猜数字游戏示例详解
2022-03-02 21:01:50