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

13-11-22 jhr820520
              

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

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;
}
<p>

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

想请教各位道友,这样的写法算不算异步处理?如果是的话,这样做的优点是什么?

麻烦各位帮忙解答下,多谢!!!

              

3
banq
2013-11-22 16:04

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

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

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

jhr820520
2013-11-22 16:13

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

banq大大,我个人的理解是:如果要获得异步请求的响应无非是两种方式:

1、等待(wait),响应回来唤醒;

2、轮询,定时去获取结果;

如果按照您说的,调用后即不管了,那么响应如何获取,或者说响应回来如何第一时间通知调用者?

banq
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修改过]

SpeedVan
2013-11-25 15:32

异步执行却要等待获取,还叫异步么?

刷牙后吃早饭,告诉我,如何异步?

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

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

2Go 1 2 下一页