如何通过线程池异步调用

摘要:
可以直接使用JAVA的线程池技术,用新的线程调用系统B的接口,从而达到异步调用的目的。进一步思考,我编写了一个ThreadPoolExecutor,简要介绍了JAVA线程池的一些基本用法。ThreadPoolExecutor还使用生产者-消费者模式的思想。但是,ThreadPoolExecutor仅在必要时使用队列。它的性能远远高于上述直接使用队列的方法。

生产者-消费者模式在系统交互方面,有几个特点: 
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系统接口,直接交互的。

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


生产者-消费者模式


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

这里写图片描述


进一步思考


之前写过一篇ThreadPoolExecutor简单介绍介绍了JAVA线程池的一些基本用法,ThreadPoolExecutor也利用了生产者-消费者模式的思想,只不过 
ThreadPoolExecutor是有必要的时候才使用队列,性能是比上面的直接使用队列的方式性能要高很多的。实际操作中也可以借鉴这种做法。

免责声明:文章转载自《如何通过线程池异步调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySql分页查询Jmeter查看QPS和响应时间随着时间的变化曲线(转载)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java并发编程-多线程

1、进程与线程   一个程序就是一个进程,一个程序中的多个任务被称为线程。进程是资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位。多线程的好处并发执行提高了程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态 2、线程的实现方式 继承java.lang.Thread类 实现java.lang.Runnable接口,然后交...

Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等

这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数、Mybatis、事务管理等。 本节所使用的代码是在上一节项目代码中,继续追加的,因此需要先学习上一节内容。 一、使用@Async实现异步调用 要在springboot中使用异步调用方法,只要在被调用的方法上面加上@Async就可以...

Debug技巧

多线程调试 有些时候为了观察多个线程间变量的不同状态,以及锁的获取等,就会想到在代码里加个断点debug一下。  在IDE里断点停下来的时候,可以切换到另外的线程中,跑其他的代码,不会互相影响。这里是有个开关的,在Eclipse里默认开启, 在IntelliJ IDEA里默认是没有开启的。也就是说如果你在IDEA里代码里加断点,虽然一个线程的断了下来,但其...

Ajax异步调用Controller的Return JsonResult生成下拉列表

1 @using System.Web.Optimization; 2 @{ 3 Layout = null; 4 } 5 6 <!DOCTYPE html> 7 8 <html> 9 <head> 10 <meta name="viewport" content="width...

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄

转自:http://www.cnblogs.com/freshman0216/archive/2008/07/29/1252253.html 本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始, 希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细...

多线程中,ResultSet为空,报错空指针

最近在数据库查询数据时,由于数据量太大,使用了多线程,通过线程池建了好几个线程,然后调用了一个封装好的jdbc查询语句。 结果在多线程中,ResultSet报错空指针。 仔细查阅后,才发现多个线程访问了同一个connection,事务混乱,导致了空指针。 解决方法: 使用数据库连接池,这样一个线程各自使用一个connection,就不会有冲突了。...