同步回调
我们常用的一些请求都是同步回调的,同步回调是阻塞的,单个的线程需要等待结果的返回才能继续执行。
异步回调
有的时候,我们不希望程序在某个执行方法上一直阻塞,需要先执行后续的方法,那就是这里的异步回调。我们在调用一个方法时,如果执行时间比较长,我们可以传入一个回调的方法,当方法执行完时,让被调用者执行给定的回调方法。
异步回调java实现demo
client接口
public interface Client {
// 调用服务提供者的处理方法
void process(int a,int b);
// 异步回调方法
void result(int i);
}
clientA类实现client接口
public class ClientA implements Client{
// 初始化一个私有服务提供者
private Server server;
public ClientA(Server server){
this.server = server;
}
@Override
public void process(int a,int b) {
ClientA c = this;
// 这里启用另一个线程,让此线程继续执行
new Thread(new Runnable() {
@Override
public void run() {
server.add(a,b,c);
}
}).start();;
System.out.println("ClientA process end");
}
//异步返回结果
@Override
public void result(int i) {
System.out.println("ClientA result is :"+i);
}
}
clientB类实现client接口
public class ClientB implements Client{
// 初始化一个私有服务提供者
private Server server;
public ClientB(Server server){
this.server = server;
}
@Override
public void process(int a,int b) {
ClientB c = this;
// 这里启用另一个线程,让此线程继续执行
new Thread(new Runnable() {
@Override
public void run() {
server.add(a,b,c);
}
}).start();;
System.out.println("ClientB process end");
}
//异步返回结果
@Override
public void result(int i) {
System.out.println("ClientB result is :"+i);
}
}
server类
public class Server {
public void add(int i, int j,Client client) {
// 要返回的结果
int res = i+j;
// 线程休息2秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 调用异步通知方法
client.result(res);
}
}
测试Test类
public class Test {
public static void main(String[] args) {
Server server = new Server();
ClientA clientA = new ClientA(server);
clientA.process(5,6);
ClientB clientB = new ClientB(server);
clientB.process(50,60);
}
}
执行结果是
ClientA process end
ClientB process end
ClientA result is :11
ClientB result is :110