同步、异步

异步,归根结底你仍是须要关心结果的,但可能不是当时的时间点关心,能够用轮询或者回调等方式处理结果;同步是须要当时关心的结果的;而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);
    }
}