>  기사  >  Java  >  Java 비동기 콜백 메커니즘 예시 분석

Java 비동기 콜백 메커니즘 예시 분석

伊谢尔伦
伊谢尔伦원래의
2016-12-10 09:56:561697검색

1. 콜백이란 무엇인가요?

콜백, 콜백. 호출자와 호출 수신자 사이에 콜백이 있기 전에 먼저 호출이 있어야 합니다. Baidu 백과사전에서는 다음과 같습니다.

소프트웨어 모듈 간에는 항상 특정 인터페이스가 있습니다. 호출 방법 측면에서 동기 호출, 콜백 및 비동기 호출의 세 가지 범주로 나눌 수 있습니다.
콜백은 특별한 종류의 호출이며 세 가지 방법이 조금 다릅니다.

1. 동기식 콜백, 즉 차단, 단방향.

2. 콜백, 즉 양방향(자전거의 두 기어와 유사)입니다.

3. 비동기 호출, 즉 비동기 메시지를 통한 알림입니다.

2. CS의 비동기 콜백(Java 사례)

예를 들어 다음과 같은 시나리오가 시뮬레이션됩니다. 클라이언트가 서버에 메시지를 보내고 서버가 이를 처리한 후(5초) 클라이언트에 다시 호출하여 처리가 성공했음을 알려줍니다. 코드는 다음과 같습니다.

콜백 인터페이스 클래스:

public interface CSCallBack {
    
  public void process(String status); 
}

시뮬레이션된 클라이언트:

public class Client implements CSCallBack {

    private Server server;    
    public Client(Server server) {        
        this.server = server;
    }    
        public void sendMsg(final String msg){
           System.out.println("客户端:发送的消息为:" + msg);        
            new Thread(new Runnable() {            
            @Override
            public void run() {
                server.getClientMsg(Client.this,msg);
            }
        }).start();
        System.out.println("客户端:异步发送成功");
    }    
            @Override
    public void process(String status) {
        System.out.println("客户端:服务端回调状态为:" + status);
    }
}

시뮬레이션된 서버:

public class Server {
 public void getClientMsg(CSCallBack csCallBack , String msg) {
        System.out.println("服务端:服务端接收到客户端发送的消息为:" + msg);        
       // 模拟服务端需要对数据处理
        try {
            Thread.sleep(5 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("服务端:数据处理成功,返回成功状态 200");
        String status = "200";
        csCallBack.process(status);
    }
}

테스트 class :

public class CallBackTest {
    public static void main(String[] args) {
        Server server = new Server();
        Client client = new Client(server);

        client.sendMsg("Server,Hello~");
    }
}

테스트 클래스 실행 - 인쇄된 결과는 다음과 같습니다.

客户端:发送的消息为:Server,Hello~
客户端:异步发送成功
服务端:服务端接收到客户端发送的消息为:Server,Hello~
(这里模拟服务端对数据处理时间,等待5秒)
服务端:数据处理成功,返回成功状态 200客户端:服务端回调状态为:200

코드를 단계별로 분석하고 핵심 요약은 다음과 같습니다

1、接口作为方法参数,其实际传入引用指向的是实现类
2、Client的sendMsg方法中,参数为final,因为要被内部类一个新的线程可以使用。这里就体现了异步。
3、调用server的getClientMsg(),参数传入了Client本身(对应第一点)。

3. 콜백 적용 시나리오

현재 콜백은 어떤 시나리오에서 더 자주 사용됩니까? 운영 체제에서 개발자에게 호출:

1. Windows 플랫폼의 메시지 메커니즘 2. WeChat 인터페이스를 비동기적으로 호출하고 WeChat 반환 상태에 따라 비즈니스 로직에 응답합니다. 3. 서블릿의 필터는 콜백 기능을 기반으로 하며 컨테이너 지원이 필요합니다.

보충: 필터와 인터셉터의 차이점은 인터셉터가 Java의 반사 메커니즘을 기반으로 하며 컨테이너와 아무 관련이 없다는 것입니다. 그러나 콜백 메커니즘과 동일한 목적을 가지고 있습니다.

간단히 말하면 이 디자인을 사용하면 기본 코드가 상위 수준(구현 계층)에서 정의된 서브루틴을 호출할 수 있어 프로그램의 유연성이 향상됩니다.

4. 모드 비교

위에서 언급했듯이 Filter와 Intercepter는 접근 방식은 비슷하지만 목적은 동일합니다. 실제로 인터페이스 콜백 메커니즘도 디자인 패턴과 유사합니다. 관찰자 패턴:

관찰자 패턴:

GOF는 "객체의 일대다 종속 관계를 정의합니다. 객체의 상태가 변경되면 이에 의존하는 모든 객체가 통보되고 업데이트됩니다.” 인터페이스 콜백 메소드를 통해 구현되는 패턴, 즉 콜백의 표현입니다.

인터페이스 콜백:

옵저버 패턴과의 차이점은 특정 구현이 아닌 원칙이라는 점입니다.

5. 경험

4단계 요약:

메커니즘이 원칙입니다.
모델은 발현이다.
특정 시나리오와 일반적인 패턴을 기억하세요.
그럼 원리를 깊이 있게 이해해 보세요.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.