자바 리 셋 메커니즘 해독

모듈 간 호출
하나의 응용 시스템 에서 어떤 언어 로 개발 하 든 모듈 간 의 호출 이 반드시 존재 하고 호출 방식 은 몇 가지 로 나 뉜 다.
(1)동기 호출

동기 호출 은 가장 기본 적 이 고 가장 간단 한 호출 방식 이다.클래스 A 의 방법 a()클래스 B 를 호출 하 는 방법 b()는 b()방법 이 실 행 될 때 까지 기 다 렸 고 a()방법 은 계속 내 려 갔다.이러한 호출 방식 은 방법 b()의 실행 시간 이 길지 않 은 경우 에 적용 된다.b()방법 이 실행 시간 이 길 거나 직접 막 히 면 a()방법의 나머지 코드 는 실행 할 수 없 기 때문에 전체 절차 가 막 힐 수 있다.
(2)비동기 호출

비동기 호출 은 동기 호출 이 차단 되 어 전체 프로 세 스 가 걸 릴 수 있 는 호출 방식 을 해결 하기 위 한 것 이다.클래스 A 의 방법 a()는 새로운 스 레 드 방식 으로 클래스 B 의 방법 b()를 호출 하고 코드 는 이어서 직접 아래로 실행 합 니 다.그러면 방법 b()가 얼마나 오래 실행 되 든 방법 a()의 실행 을 막 지 않 습 니 다.그러나 이런 방식 은 방법 a()가 방법 b()의 집행 완 료 를 기다 리 지 않 기 때문에 방법 a()가 방법 b()의 집행 결 과 를 필요 로 하 는 상황 에서(구체 적 인 업무 에 따라 정 해진 다.일부 업 무 는 비동기 스 레 드 에서 위 챗 알림 을 보 내 고 캐 시 를 새로 고치 면 필요 없다)일정한 방식 으로 방법 b()의 집행 결 과 를 감청 해 야 한다.자바 에 서 는 Future+Callable 방식 으로 이 를 할 수 있 습 니 다.
(3)반전

마지막 으로 리 턴 이다.리 턴 의 사상 은:
클래스 A 의 a()방법 은 클래스 B 의 b()방법 을 호출 합 니 다
  • 클래스 B 의 b()방법 은 클래스 A 를 주동 적 으로 호출 하 는 callback()방법 을 실 행 했 습 니 다
  • 이런 호출 방식 은 위의 그림,즉 쌍방 향 호출 방식 을 구성 했다.
    코드 예제
    다음은 리 셋 코드 예 시 를 살 펴 보 겠 습 니 다.코드 는 이런 장면 을 모 의 한 것 입 니 다.선생님 이 학생 에 게 질문 을 하고 학생 들 이 생각 을 마치 고 선생님 께 대답 합 니 다.
    먼저 리 셋 인 터 페 이 스 를 정의 합 니 다.한 가지 방법 만 tellAnswer(int answer)입 니 다.즉,학생 들 이 생각 을 마치 고 선생님 께 답 을 알려 드 리 는 것 입 니 다.
    
    /**
     *     ,    http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public interface Callback {
     public void tellAnswer(int answer);
    }
    
    교사 대상 을 정의 하여 Callback 인 터 페 이 스 를 실현 합 니 다.
    
    /**
     *     ,    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);
     }
    }
    
    선생님 대상 은 두 가지 Public 방법 이 있 습 니 다.
    (1)리 턴 인터페이스 tellAnswer(int answer),즉 학생 들 이 질문 에 대답 한 후에 선생님 이 해 야 할 일 입 니 다.
    (2)질문 방법 askQuestion(),즉 학생 에 게 질문
    이 어 학생 인 터 페 이 스 를 정의 한다.학생 들 은 당연히 문 제 를 해결 하지만 Callback 인 자 를 받 으 면 학생 들 은 문 제 를 해결 하고 누구 에 게 보고 할 지 알 수 있다.
    
    /**
     *     ,    http://www.cnblogs.com/xrq730/p/6424471.html
     */
    public interface Student {
     public void resolveQuestion(Callback callback); 
    }
    마지막 으로 구체 적 인 학생 을 리 키 라 고 정의 합 니 다.
    
    /**
     *     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(); 
     } 
    }
    
    코드 실행 결과 한 줄 만:
    알 겠 습 니 다.당신 의 답 은 3 입 니 다.
    간단하게 정리 하고 분석 해 보면 이 예 는 바로:
    (1)선생님 이 학생 인 터 페 이 스 를 호출 하 는 방법 resolve Question,학생 에 게 질문
    (2)학생 들 이 문 제 를 해결 한 후에 선생님 의 반전 방법 인 tellAnswer 를 사용한다.
    이런 절 차 는 양 방향 호출 의 관 계 를 구성 했다.
    코드 분석
    위의 코드 를 분석 해 보 세 요.위의 코드 는 제 가 여기 서 두 층 의 추상 을 만 들 었 습 니 다.
    (1)선생님 을 추상적으로
    선생님 을 추상 화한 후에 학생 들 에 게 어떤 선생님 이 저 에 게 문 제 를 물 었 는 지 관심 을 가 질 필요 가 없습니다.제 가 묻 는 문제 에 따라 답 을 얻 은 다음 에 질문 하 는 선생님 께 말씀 드 리 면 됩 니 다.선생님 이 한 번 또 한 번 바 뀌 어도 제 학생 들 에 게 아무런 영향 이 없습니다.
    (2)학생 을 추상 화
    학생 을 추상 화하 면 선생님 에 게 매우 유연 하 다.왜냐하면 선생님 이 한 학생 에 게 질문 을 하 는 것 이 아니 라 리 키,잭,루 시 세 학생 에 게 동시에 질문 을 할 수 있 기 때문이다.그러면 구성원 변 수 를 Student 에서 List로 바 꿀 수 있다.이렇게 질문 할 때 Student 목록 을 옮 겨 다 니 며 질문 을 한 다음 에 모든 학생 의 대답 을 얻 으 면 된다.
    이 예 는 전형 적 인 인터페이스 작용 을 나타 내 는 예 이다.이렇게 말 하 는 이 유 는 일부 친구 들 이 인터페이스의 장점 을 잘 모 를 수도 있 고 인터페이스의 장점 을 잘 모 르 는 친구 들 이 이 예 를 중점적으로 보고 많이 이해 할 수 있다 고 생각 하기 때문이다.
    결론 적 으로 리 셋 의 핵심 은 리 셋 측 이 자체 즉 this 를 호출 자 에 게 전달 하 는 것 이다.그러면 호출 자가 호출 이 끝 난 후에 리 셋 측 에 알 고 싶 은 정 보 를 알려 줄 수 있다.리 셋 은 하나의 사상 이 고 하나의 체제 이다.구체 적 으로 어떻게 실현 하 는 지,코드 를 통 해 리 셋 을 우아 하 게 실현 하 는 지,확장 성 이 비교적 높 게 실현 하 는 지,개발 자의 개인 수준 을 보면 개발 자가 업무 에 대한 이해 정 도 를 볼 수 있다.
    동기 반전 과 비동기 반전
    위의 예 에서 누군가가 이런 의문 을 제기 할 수 있다.
    이 예 는 어떤 반전 이 필요 합 니까?동기 호출 방식 을 사용 합 니까?학생 대상 이 문 제 를 대답 한 후에 바로 대답 한 답 을 선생님 대상 에 게 되 돌려 주면 되 지 않 습 니까?
    이 문제 의 제 기 는 아무런 문제 도 없 으 니 두 가지 측면 에서 이 문 제 를 이해 할 수 있다.
    우선 선생님 은 학생 들 의 답 만 얻 으 려 고 하지 않 으 면 어떻게 합 니까?아마 이 선생님 은 학생 들 의 문제 풀이 방향 을 더 듣 는 선생님 일 것 입 니 다.학생 들 의 답 을 얻 기 전에 선생님 은 학생 들 의 이름과 학생 들 의 문제 풀이 방향 을 먼저 알 고 싶 어 합 니 다.물론 어떤 사람들 은 제 가 대상 을 정의 할 수 있 습 니 다.그 안에 학생 들 의 이름과 문제 풀이 방향 을 더 하면 되 지 않 겠 습 니까?이 견 해 는 내 가 보기에 두 가지 문제 가 있다.
    (1)만약 에 선생님 이 원 하 는 데이터 가 점점 많아 지면 돌아 오 는 대상 이 점점 커지 고 리 셋 을 사용 하면 데이터 분 리 를 할 수 있 으 며 일부 데 이 터 를 리 셋 방법 에 넣 어 처리 할 수 있다.어떤 데 이 터 는 구체 적 인 업무 에 따라 정 하고 리 턴 참 수 를 늘 려 야 한다 면 리 셋 방법 에서 직접 증가 하면 된다.
    (2)선생님 이 학생 의 이름,학생 의 문제 풀이 방향 이 학생 의 대답 보다 먼저 되 기 를 바 라 는 문 제 를 해결 할 수 없다.
    따라서 저 는 특정한 결 과 를 간단하게 되 돌려 주 는 것 은 리 셋 을 사용 하지 않 고 동기 화 호출 을 직접 사용 할 수 있다 고 생각 합 니 다.그러나 여러 가지 데이터 가 처리 해 야 하고 데이터 가 주 된 부분 이 있 으 면 리 셋 을 사용 하 는 것 이 더욱 적합 한 선택 이 고 우선 처리 하 는 데 이 터 를 리 셋 방법 에 넣 어서 먼저 처리 할 것 입 니 다.
    또 다른 이해 의 각 도 는 더욱 중요 하 다.바로 제목 이 말 하 는 동기 반전 과 비동기 반전 이다.예 는 동시 반전 의 예 이다.선생님 이 리 키 에 게 문 제 를 물 었 다 는 뜻 이다.리 키 는 답 을 주 었 다.선생님 이 다음 친구 에 게 물 었 고 답 을 얻 은 후에 다음 친구 에 게 계속 물 었 다.이것 은 정상 적 인 장면 이다.그러나 만약 에 내 가 장면 을 바 꾸 면:
    선생님 은 원 바 이 원 이 이렇게 질문 하 는 것 이 아니 라 리 키,마이크,루 시,브 루스,케 이 트 등 다섯 명의 친구 에 게 동시에 질문 을 해서 친구 들 이 스스로 생각 하 게 하고,어떤 친구 가 생각 을 다 했 으 면 바로 선생님 께 답 을 알려 주면 된다.
    이런 장면 은 학생 들 이 문 제 를 다 생각 한 후에 선생님 께 두 가지 해결 방안 이 있다 고 알려 야 한 다 는 것 과 같다.
    (1)Future+Callable 방식 을 사용 하여 비동기 스 레 드 실행 결 과 를 기다 리 는 것 은 동기 호출 의 변종 에 해당 합 니 다.그 본질 은 방법 이 결 과 를 되 돌려 주 는 것 이기 때 문 입 니 다.즉,학생 들 의 대답 입 니 다.
    (2)비동기 리 셋 을 사용 하여 학생 들 이 문 제 를 대답 하고 리 셋 인터페이스 방법 으로 선생님 께 답 을 알려 드 리 면 됩 니 다.선생님 의 대상 이 Callback 인터페이스 로 추상 화 되 었 기 때문에 이런 방법 은 확장 성 이 매우 좋다.앞에서 말 한 것 처럼 선생님 이 바 뀌 어도 학생 들 에 게 관심 을 가 지 는 것 은 Callback 인터페이스 로 필요 한 정 보 를 전달 하 는 것 이다.
    이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기