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


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


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接口
..............................................
}
}

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

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

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

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

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

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

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

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

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

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

这里当然算异步, 因为你submit之后可以去做任何事情了,主线程没有同步等待. 只不过你可以做任何事情, 你没有去做,而是傻傻在哪里等.也就是你用了异步的方式实现了同步?代码本质还是异步的.
简单讲, 你可以在主线程中做执行任何方案, 然后在需要结果的时候调用future.get()
在举例子,就是多个线程执行,可以全部submit之后,再同步等待,这些子线程执行就是异步的.
如果处理的结果不想主线程关心, 那就可以传递一个回调函数,让子线程执行完任务处理