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("【客户端】异步代码被输出"); } }
/** * 一、接口做为方法参数,其实际传入引用指向的是实现类 * 二、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~,等待返回消息"); client.asynchronizationTest(); } }