博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何通过线程池异步调用
阅读量:7220 次
发布时间:2019-06-29

本文共 1001 字,大约阅读时间需要 3 分钟。

生产者-消费者模式在系统交互方面,有几个特点: 

1、系统解耦 
2、解决并发问题 
3、不需要关心对方系统何时处理数据,处理结果如何

下面用几个简单例子逐步说明。


简单例子


假设有两个系统,A系统和B系统,B系统需要依赖A系统产生的数据,也就是说,A系统产生数据后,必须把数据扔给B系统。 

这个时候,可以让B系统提供一个方法,比如说提供一个http接口sendData(),然后A系统直接调用即可。

这里写图片描述

这种方案在流量不大的情况下,完全没问题的,但是如果系统并发量大的情况下,每次A系统同步调用B系统的sendData()接口时,就会被阻塞住,如果sendData方法处理的很慢,那么会直接影响A系统的吞吐量的。 

因此最好能异步的调用B系统的接口,然后A系统可以立刻返回,继续处理其他事情。

可以直接使用JAVA的线程池技术,new一个线程调用B系统的接口,达到异步调用的目的。 

这里写图片描述

这样的话,A系统就只管发送数据了,无需理会B系统接口的处理速度如何,也不会被B系统的接口阻塞住。但是此时还是有两个问题: 

1、B系统此时需要做一些应付大并发量的处理,因为面对A系统的狂轰滥炸,B系统可能处理不过来的。 
2、A系统和B系统还是耦合了。因为A系统还是直接调用B系统接口,直接交互的。

有没有更好的方案,双方既能处理并发,同时两个系统之间又无需耦合呢?答案是使用生产者-消费者模式


生产者-消费者模式


生产者-消费者模式通过引入一个阻塞队列这个第三方组件来做到解耦和处理并发。 

生产者只需要往队列里面塞数据,消费者只需要从队列中读取数据,生产者再也无需关注消费者处理数据的速度是如何了。生产者和消费者已经是完全独立的了。 
利用某些队列特性,当生产者速度太快的话,数据超过了队列的最大阀值,那么可以自动阻塞住生产者(当然也可以设置线程阻塞的超时时间,防止消费者挂掉了,一直不处理队列中的数据,生产者),一直等到消费者先消费一些数据。

这里写图片描述


进一步思考


之前写过一篇介绍了JAVA线程池的一些基本用法,ThreadPoolExecutor也利用了生产者-消费者模式的思想,只不过 

ThreadPoolExecutor是有必要的时候才使用队列,性能是比上面的直接使用队列的方式性能要高很多的。实际操作中也可以借鉴这种做法。

转载于:https://www.cnblogs.com/maohuidong/p/8034203.html

你可能感兴趣的文章
.NetCore应用多个target framework
查看>>
pdfminer获取整页文本
查看>>
windows服务器多端口Redis安装步骤
查看>>
第二次作业心得
查看>>
爬虫——请求库之requests
查看>>
android子线程更新UI,与主Thread一起工作
查看>>
50行实现简易HTTP服务器
查看>>
细讲递归(recursion)
查看>>
进程和进程间通信
查看>>
微处理器的两种结构比较
查看>>
ORACLE EXPIRED(GRACE)
查看>>
Markdown应用样例
查看>>
多文本框的值得存放和赋值
查看>>
Linux中计划任务执行脚本crontab-简洁版
查看>>
Java - IO
查看>>
安卓app中嵌入一个H5页面,当手机系统设置字体变大时,如何使H5页面的字体不会随用户自己调整的系统字体变化而变化?...
查看>>
safari 收藏导出 手机safari 导出
查看>>
Dalvik 虚拟机 jvm 区别
查看>>
hexo从零开始
查看>>
币值转换
查看>>