回调接口
public interface CSCallBack {
void process(String status);
}
服务端实现
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Server {
public void getClientMsg(CSCallBack csCallBack , String msg) {
log.info("【服务端】接收到客户端发送的消息为:{}", msg);
// 模拟服务端需要对数据处理
try {
Thread.sleep(15 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("【服务端】执行完成");
String status = "200";
log.info("【服务端】数据处理成功,返回成功状态:{}", status);
csCallBack.process(status);
}
}
客户端实现
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Client implements CSCallBack {
private Server server;
public Client(Server server) {
this.server = server;
}
public void sendMsg(final String msg) {
log.info("【客户端】发送消息:" + msg);
// 新起线程的作用就是使asynchronizationTest方法得以异步调用
new Thread(() -> {
server.getClientMsg(Client.this, msg);
}).start();
}
/**
* 具体的回调方法
*
* @param status
*/
public void process(String status) {
log.info("【客户端】接收到服务端回调状态为:{}", status);
}
public void asynchronizationTest() {
log.info("【客户端】异步代码被输出");
}
}
测试
/**
* 1、接口作为方法参数,其实际传入引用指向的是实现类
* 2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。
* 3、调用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~,等待返回消息");
client.asynchronizationTest();
}
}