日期:2014-05-20  浏览次数:20714 次

java 怎么去实现异步通信
java 怎么去实现异步通信?
启动一个主线程,A线程发送数据,B线程接受数据,当B线程收到数据返回给主线程接受。怎么去实现?
类似与android的handler机制


------解决方案--------------------
public interface Future<V>Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。 

------解决方案--------------------
关键字 “线程间通信”
------解决方案--------------------
模型显得太复杂了,既然涉及到服务器间通讯,不如就直接用消息队列去简化它:
A --JMS--> C 
基本上就完毕了,JMS很轻量级的。
但这种需要整个模型基于异步通讯模式,如果不调整浏览器实现,会面临回调消息的投递问题。


另一种是为了提供同步转异步的场合,会复杂些,这种场合需要有人负责将Web来胡同步调用转为异步调用。
那么确实会引入B,B负责将请求消息投递给JMS,并负责监听JMS中的返回消息,大致系统流模型类似于:
0、Bcatch将自己注册到JMS,作为回调消息队列的监听者;
1、A生成请求消息对象,比如:voMsg
2、A将voMsg放入JVM内部消息池,比如:lstQueue
3、A对voMsg执行wait(),阻塞自己
4、Bthow从lstQueue中取出消息,生成唯一消息标示msgID(A负责生成也行),将其存入Map<msgID, voMsg>中,然后投递给JMS的请求消息队列;
5、C(另一台服务器)作为监听器从JMS的请求消息队列中得到请求,执行,将结果投递到JMS的回调消息队列;
6、JMS的回调消息队列触发Bcatch监听器;
7、Bcatch从回调消息取得msgID,从Map中取出voMsg,然后将回调消息的结果信息加入voMsg中,对其执行notify();
8、A从voMsg的wait()中被唤醒,继续执行。