>Java >Java베이스 >Java 콜백 메커니즘 소개

Java 콜백 메커니즘 소개

尚
앞으로
2020-06-17 17:06:342433검색

Java 콜백 메커니즘 소개

모듈 간 호출

응용 시스템에서는 어떤 언어를 사용하여 개발하든 모듈 간 호출이 있어야 합니다.

(1) 동기 호출

동기 호출은 가장 기본적이고 간단한 호출 방법입니다. 클래스 A의 메소드 a()는 클래스 B의 메소드 b()를 호출합니다. b() 메소드의 실행이 완료되기를 기다리고, a() 메소드는 계속해서 내려가세요. 이 호출 방법은 b() 메소드의 실행 시간이 길지 않은 상황에 적합합니다. b() 메소드의 실행 시간이 길거나 직접 차단되면 a() 메소드의 나머지 코드가 실행할 수 없으며 이로 인해 전체 프로세스가 차단됩니다.

(2) 비동기 호출

비동기 호출은 동기 호출이 차단되어 전체 프로세스가 중단될 수 있는 문제를 해결하기 위해 제작된 호출 방법입니다. 클래스 A의 메소드 a()는 새 스레드를 시작하여 클래스 B의 메소드 b()를 호출하고 코드는 직접 실행됩니다. 따라서 메소드 b()를 실행하는 데 시간이 얼마나 걸리더라도 a()의 메소드 실행을 차단하지 마십시오.

이렇게 하면 메소드 a()는 메소드 b()의 실행이 완료될 때까지 기다리지 않기 때문에 메소드 a()가 메소드 b()의 실행 결과를 요구하는 경우(특정 비즈니스에 따라 다름) WeChat 알림을 보내거나 캐시를 새로 고치기 위해 비동기 스레드가 필요하지 않습니다. b() 메서드의 실행 결과는 특정 방식으로 모니터링되어야 합니다.

(3) 콜백

마지막은 콜백입니다. 콜백의 개념은 다음과 같습니다.

  • 클래스 A의 a() 메서드는 클래스 B의 b() 메서드를 호출합니다.
  • 클래스 B b() 메서드가 실행된 후 클래스 A의 callback() 메서드를 적극적으로 호출합니다. 이러한 호출 메서드는 위의 그림과 같은 양방향 호출 메서드를 구성합니다.
코드 예시

다음으로 콜백 코드 예시를 살펴보겠습니다. 교사가 학생에게 질문을 하고, 학생이 생각한 후 교사에게 대답하는 시나리오를 시뮬레이션합니다. .

먼저 콜백 인터페이스를 정의합니다. TellAnswer(int 답변) 메서드는 하나만 있습니다. 즉, 학생이 생각한 후 교사에게 답을 알려줍니다.

/**
 * 回调接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public interface Callback {

    public void tellAnswer(int answer);

}
교사 개체를 정의하고 콜백 인터페이스를 구현합니다.

/**
 * 老师对象,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public class Teacher implements Callback {

    private Student student;

    public Teacher(Student student) {
        this.student = student;
    }

    public void askQuestion() {
        student.resolveQuestion(this);
    }

    @Override
    public void tellAnswer(int answer) {
        System.out.println("知道了,你的答案是" + answer);
    }

}

두 개의 교사 개체가 있습니다. 공개 메서드:

(1) 콜백 인터페이스 TellAnswer(int 대답), 즉 학생이 질문에 답변한 후 교사가 해야 할 일

(2) 질문하기 메서드 AskQuestion( ), 즉, 학생에게 질문을 하세요

그런 다음 학생 인터페이스를 정의합니다. 물론 학생들은 문제를 해결하지만 콜백 매개변수를 수신하므로 학생들은 문제 해결 후 누구에게 보고해야 할지 알 수 있습니다.

/**
 * 学生接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public interface Student {

    public void resolveQuestion(Callback callback);

}
마지막으로 특정 인터페이스를 정의합니다. Ricky라는 학생:
/**
 * 一个名叫Ricky的同学解决老师提出的问题,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public class Ricky implements Student {

    @Override
    public void resolveQuestion(Callback callback) {
        // 模拟解决问题
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {

        }

        // 回调,告诉老师作业写了多久
        callback.tellAnswer(3);
    }

}
문제를 푼 후 16장 선생님에게 답을 보고하세요.


테스트 클래스 작성은 비교적 간단합니다.

/**
 * 回调测试,原文出处http://www.cnblogs.com/xrq730/p/6424471.html
 */
public class CallbackTest {

    @Test
    public void testCallback() {
        Student student = new Ricky();
        Teacher teacher = new Teacher(student);

        teacher.askQuestion();

    }

}

코드 실행 결과는 단 한 줄입니다.

<span style="color: #000000;">知道了,你的答案是3<br></span>
이 예제에 대한 간략한 요약 및 분석은 다음과 같습니다.

(1) 교사가 학생 인터페이스의 메소드solveQuestion 및 학생에게 질문하기 질문하기

(2) 학생이 문제를 해결한 후 교사의 콜백 메소드 TellAnswer

를 호출합니다. 이 일련의 프로세스는 양방향 호출 관계를 구성합니다.

코드 분석


위 코드를 분석합니다. 위 코드에 대해 두 가지 수준의 추상화를 만들었습니다.

(1) 교사 추상화

학생을 위해 교사를 추상화한 후 어느 선생님이 나에게 질문했는지는 신경 쓸 필요가 없습니다. 질문에 기초하여 답을 얻으면 문제를 낸 선생님에게 말하면 선생님이 차례로 바뀌더라도 상관 없습니다. 내 학생들. 영향이 없습니다

(2) 추상적인 학생들

  • 학생을 추상화한 후에는 교사가 반드시 한 학생에게 질문할 필요는 없지만 세 명의 학생(Ricky, Jack, Lucy)에게 동시에 질문할 수 있기 때문에 교사에게는 매우 유연합니다. 멤버 변수 Student를 List로 변경할 수 있습니다. 이렇게 하면 질문할 때 Student 목록을 탐색하여 질문한 다음 각 학생으로부터 답변을 얻을 수 있습니다.

이 예는 다음을 반영하는 전형적인 예입니다. 인터페이스의 역할. 인터페이스의 이점을 잘 이해하지 못하는 친구들이 생각나서 이렇게 말씀드립니다. 인터페이스의 이점을 잘 이해하지 못하는 친구들은 이 예에 집중하여 더 많은 것을 이해할 수 있습니다.

요약하자면 콜백의 핵심은 콜백 당사자가 자신을 호출자에게 전달하여 호출자가 통화가 완료된 후 콜백 당사자에게 알고 싶은 정보를 알릴 수 있다는 것입니다. 콜백은 아이디어이자 메커니즘입니다. 콜백을 코드를 통해 우아하고 확장성 있게 구현하는 방법은 개발자의 개인 수준과 비즈니스에 대한 이해에 따라 다릅니다.

동기식 콜백과 비동기식 콜백

위의 예에서 누군가 다음과 같이 질문할 수 있습니다.

이 예에는 어떤 종류의 콜백이 필요합니까? 동기 호출 방법을 사용하면 학생 개체가 이후에 질문에 직접 대답합니다. 선생님 개체에게 답변을 돌려주는 것이 좋지 않을까요?

이 질문을 제기하는 데에는 문제가 없습니다. 이 질문은 두 가지 각도에서 이해될 수 있습니다.

먼저, 선생님이 학생들의 답변만을 원하는 것이 아니라면 어떨까요?

아마 이 교사는 학생들의 문제 해결 아이디어를 듣는 것을 선호하는 교사일 것입니다. 학생들의 답변을 듣기 전에 먼저 학생들의 이름과 문제 해결 아이디어를 알고 싶어할 수도 있습니다. 그러면 내가 객체를 정의할 수 있다고 말할 수 있습니다. 학생들의 이름과 솔루션 아이디어를 추가하는 것이 좋지 않을까요? 제 생각에는 이 진술에는 두 가지 문제가 있습니다.

(1) 선생님이 점점 더 많은 데이터를 원할 경우 반환되는 개체는 점점 더 커져야 하며 콜백을 사용하면 데이터를 분리하고 일괄 데이터를 분리할 수 있습니다. 어떤 데이터가 특정 사업에 따라 달라지는지, 반환 매개변수를 추가해야 한다면 콜백 메소드에 직접 추가하면 됩니다

(2) 교사가 학생의 데이터를 가져오려는 것은 해결될 수 없습니다. 이름과 학생의 문제 해결 아이디어 이전에 학생들이 답변한 질문

그래서 단순히 특정 결과를 반환하기 위해 콜백을 사용할 필요는 없으며 직접 동기 호출을 사용할 수 있다고 생각합니다. 그러나 여러 유형의 데이터가 있는 경우. 처리해야 하는 데이터가 1차 데이터와 2차 데이터로 분류되어 있으므로 콜백을 사용하는 것이 더 적절한 방법은 처리할 우선순위 데이터를 콜백 메서드에 넣는 것입니다.

또 다른 각도에서 이해하는 것이 더 중요합니다. 제목에 언급된 동기 콜백과 비동기 콜백입니다. 예시는 동기식 콜백으로, 교사가 Ricky에게 질문을 하고, Ricky가 답변을 제공하고, 교사가 다음 동급생에게 질문하고, 답변을 받은 후 다음 동급생에게 계속 질문하는 것을 의미합니다. 이것은 일반적인 시나리오이지만, 만약 그렇다면. 시나리오를 변경합니다. 살펴보기:

선생님은 One-By-One과 같은 질문을 원하지 않고 대신 Ricky, Mike, Lucy, Bruce, Kate 다섯 명의 학생에게 동시에 질문했습니다. 학생이 스스로 생각하도록 하세요. 어떤 학생이 잘 생각했는지는 선생님에게 직접 말해줍니다.

이 시나리오는 학생들이 문제에 대한 생각을 마친 후 교사에게 알릴 방법이 필요하다고 말하는 것과 같습니다. 두 가지 해결책이 있습니다.

(1) Future+Callable을 사용하여 비동기 스레드 실행을 기다립니다. 결과는 동기 호출의 변형입니다. 그 본질은 메소드가 학생의 답변인 결과를 반환한다는 것입니다.

(2) 비동기 콜백을 사용하여 학생은 질문에 대한 답변을 마치고 콜백 인터페이스를 호출합니다. 선생님에게 답을 말하는 방법. Teacher 개체가 Callback 인터페이스로 추상화되어 있기 때문에 이 접근 방식은 확장성이 매우 좋습니다. 앞에서 언급한 것처럼 Teacher가 차례로 변경되더라도 학생들이 관심을 갖는 유일한 것은 Callback 인터페이스를 호출하는 것뿐입니다. 필요한 정보

더 많은 관련 지식은 java 기본 튜토리얼 칼럼

을 주목해주세요

위 내용은 Java 콜백 메커니즘 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제