异步,归根结底你仍是须要关心结果的,但可能不是当时的时间点关心,能够用轮询或者回调等方式处理结果;同步是须要当时关心的结果的;而oneway是发出去就无论死活的方式,这种对于某些彻底对可靠性没有要求的场景仍是适用的。(参考:http://tech.meituan.com/mq-design.html)html
while(true){...}无限循环询问线程是否执行完成,效率较低。java
参考git
http://lavasoft.blog.51cto.com/62575/98796/github
http://blog.csdn.net/jjavaboy/article/details/43281537微信
https://github.com/ConnL/littleproject/tree/master/callback异步
软件模块之间老是存在着必定的接口,从调用方式上,能够把他们分为三类:同步调用、回调和异步调用。ide
回调是一种特殊的调用,至于三种方式也有点不一样。函数
一、同步回调,即阻塞,单向。this
二、回调,即双向(相似自行车的两个齿轮)。spa
三、异步调用,即经过异步消息进行通知。
一、Windows平台的消息机制
二、异步调用微信接口,根据微信返回状态对出业务逻辑响应。
三、Servlet中的Filter(过滤器)是基于回调函数,需容器支持。
package callback; /** * 场景:客户端发送msg给服务端,服务端处理后(5秒),回调给客户端,告知处理成功 * 关键点: * 一、接口做为方法参数,其实际传入引用指向的是实现类 二、Client的sendMsg方法中,参数为final,由于要被内部类一个新的线程能够使用。这里就体现了异步。 三、调用server的getClientMsg(),参数传入了Client自己(对应第一点)。 */ public class CallBackTest { public static void main(String[] args) { Server server = new Server(); Client client = new Client(server); client.sendMsg("Server,Hello~"); } } package callback; /** * 回调模式-回调接口类 */ public interface CSCallBack { void process(String status); } package callback; /** * 回调模式-模拟客户端类 */ public class Client implements CSCallBack { private Server server; public Client(Server server) { this.server = server; } public void sendMsg(final String msg){ System.out.println("客户端:发送的消息为:" + msg); new Thread(new Runnable() { @Override public void run() { server.getClientMsg(Client.this,msg); } }).start(); System.out.println("客户端:异步发送成功"); } @Override public void process(String status) { System.out.println("客户端:服务端回调状态为:" + status); } } package callback; /** * 回调模式-模拟服务端类 */ public class Server { public void getClientMsg(CSCallBack csCallBack , String msg) { System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg); // 模拟服务端须要对数据处理 try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("服务端: 数据处理成功,返回成功状态 200"); String status = "200"; csCallBack.process(status); } }