发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

关于异步接口调用的疑问?

              
2013-11-22 15:43
赞助商链接


今天看了公司之前的写的一段代码,如下:


public DataBus callServcie(DataBus databus) {
Future<DataBus> future=mThreadPool.submit(new AsyncThread(databus));
if(future!=null){
try {
return future.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
return null;
}




class AsyncThread implements Callable<DataBus>{
public DataBus call() throws Exception {
//使用httpClient调用CRM接口
..............................................
}
}


想请教各位道友,这样的写法算不算异步处理?如果是的话,这样做的优点是什么?
麻烦各位帮忙解答下,多谢!!!

3
2013-11-22 16:04

future.get()应该是堵塞在这里等待结果。

这应该不算异步,基本还是同步。

异步一般是fire发射后即忘记,做别的事情了,无需立即等待刚才发射的结果。

2013-11-22 16:13

2013-11-22 16:04 "@banq"的内容
异步一般是fire发射后即忘记,做别的事情了,无需立即等待刚才发射的结果。 ...


banq大大,我个人的理解是:如果要获得异步请求的响应无非是两种方式:
1、等待(wait),响应回来唤醒;
2、轮询,定时去获取结果;
如果按照您说的,调用后即不管了,那么响应如何获取,或者说响应回来如何第一时间通知调用者?

2013-11-22 16:29

2013-11-22 16:13 "@jhr820520"的内容
调用后即不管了,那么响应如何获取 ...


你的两个方式总结得好,这里就要再高一点考虑是否需要响应的问题,也就是缩小需要响应的地方。因为越快获得响应,就是越同步化,顺序化,事务化,性能差化。

你可以考虑为什么要获得响应,你肯定是想基于响应再继续执行一些逻辑,那么将这些逻辑移植到事件的消费者那里去做,而不是在当前生产者处做,这也是reactive编程的一个特点。

比如x是1,y=x+1,那么y是2, 如果x变为3,y还是3,通过reactive函数编程,时刻观察x变化,x一旦变为3,观察者也就是消费者响应将y变成3+1。

所以,异步编程是一种事件驱动编程,需要完全改变思路,不能从原理顺序编程思路,一步一个脚印,一步一个响应地去实施算法或逻辑了。

不知我是否讲明白,有点类似脑筋急转弯。实际是将“请求响应”的思路转变到“事件驱动”思路上,是一种软件编程思维的转变。

[该贴被banq于2013-11-22 17:22修改过]

2013-11-25 15:32

异步执行却要等待获取,还叫异步么?
刷牙后吃早饭,告诉我,如何异步?

满足异步条件,两段逻辑必须独立,没先后依赖。

例如获取值,第一次访问,如果有值则获取使用,没值就呼叫别人去计算,然后就不管了。当然这个“不管了”可以做成延时获取,但到最后必须是“不管了”,一管绝对是同步了。

异步编程      Reactive编程      EDA事件驱动     

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com