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

解决方案 »

  1.   

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

  2.   

    future好像不能主动的去中断 我想起了linux的信号机制
    查了一下java的实现http://blog.csdn.net/raintungli/article/details/7178472
      

  3.   

    你这个需求,如果只是两个线程轮流给对方发消息的话,共享一个用于存放消息的对象,然后用wait/notify都可以解决问题了。
      

  4.   

    实现的是一个异步登录。点击登录,启动线程A,调用线程B发送数据给服务器,线程C接受服务器返回的数据,数据处理完成后,提交给线程A.
      

  5.   

    模型显得太复杂了,既然涉及到服务器间通讯,不如就直接用消息队列去简化它:
    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()中被唤醒,继续执行。
      

  6.   

    jms木有接触过。不过相对于应用来说,jms算是一个庞大的东西了。现在问题已经解决了。观察者模式可以解决两个线程之间的通信问题。