回调接口
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(); } }