Java回调

回调接口

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();
    }
}
原文地址:https://www.cnblogs.com/dayaodao/p/8708886.html