미래와 약속의 7 인 Netty 소스 코드 분석

一, 미래

  미래 java.util.concurrent.Future가에서 비동기 작업의 결과를 얻기 위해, 그것은 비동기 작업 결과 get () 메소드를 얻을, 동작이 방해가 완료되지 않았습니다.

  의 Netty는 작업 시간의 끝이 일을 콜백 방식을 통해 결과를 얻을 수없는 이유를 결정하기 어렵다, 이것은 매우 좋은 디자인이라고 생각합니다. 청취 모드로의 Netty의 ChannelFuture는 경우 작업의 끝은 위의 방법에서 영업 실적 가입 호출합니다.

  메서드 정의의 미래 :

공용  인터페이스 미래 <V는> 를 확장 java.util.concurrent.Future는 <V> {
     // 성공적으로 수행 
    부울 ; isSuccess을 () 

    // 취소하면 
    부울 isCancellable을 (); 

    // , 작업이 실패하면 실패 이유를 반환 
    (의 Throwable 원인을 ) 

    // 연산 콜백 종료 후, 수신기를 추가 
    ? 미래 <V>의 addListener (GenericFutureListener < (가) 확장 ? 미래 < 슈퍼 V >> ) 수신기를, 
    미래 ? <V> addListeners (GenericFutureListener < (가) 확장 미래 <? 슈퍼 V >> . 리스너에서 ..); 

    // 리스너를 제거
    미래 <V>의 removeListener이 (? GenericFutureListener는 < 는 연장 ? 미래 < 슈퍼 V >> ; 수신기) 
    미래 <V> removeListeners (GenericFutureListener <? (가) 확장 미래 <? 슈퍼 V >> ... 리스너에서) 

    // 미션이 종료 될 때까지 블록 작업이 실패 할 경우 예외를 throw 
    미래 <V> 동기화 () 던져 예외 : InterruptedException; 

    //이 차단 인터럽트에 응답하지 않는 
    미래 <V> syncUninterruptibly을 (); 

    // 작업을 기다리고 블록은 작업이 예외를 throw하지 않고 실패
     // ChannelHandler에 ChannelFuture를 호출하지 마십시오 AWAIT () 메소드는,이 교착 상태로 이어질 것입니다
     // 그 이유는 IO 스레드에 의해 시작 IO 작업이 IO 스레드와 사용자 스레드가 스레드를 통합하는 경우, 그것은 기다리고 IO 스레드로 이어질 것입니다, 사용자 비동기 알림 스레드 IO 스레드를 시작하기위한 책임이 있다는 그들의 알림 작업이 교착 상태에 주도, 완료
    미래 <V> () 기다린다는 슬로우 예외 : InterruptedException 단계; 
    미래 <V> awaitUninterruptibly ();
    부울 (기다리는  시간 초과, TimeUnit와 유닛)이 발생 예외 : InterruptedException;
    부울 (기다리고  timeoutMillis)이 발생 예외 : InterruptedException을;
    부울 awaitUninterruptibly ( 시간 초과 TimeUnit와 부);
    부울 awaitUninterruptibly ( timeoutMillis); 

    // 获取执行结果,不阻塞
    V getNow (); 

    // 取消任务执行
    @Override
     개요 boolean 취소 (부울 mayInterruptIfRunning); 
}

二, ChannelFuture

  당신이 아래로 가리 키도록하고있다 사용할 수 있도록이 인터페이스는, ChannelFuture에 메소드의 반환 매개 변수의 바로 미래입니다, 빌더 모드 같은 비트 (예 :. ChannelFuture.addListener (..)의 addListener (..) 동기화 ().).

공용  인터페이스 ChannelFuture는 확장 미래 <무효> { 

    // 返回和ChannelFuture关联的채널 
    채널 채널을 (); 

    @Override 
    ChannelFuture의 addListener은 (는 GenericFutureListener <? 연장 ? 미래 < 슈퍼 보이드 >> 리스너); 

    @Override 
    ChannelFuture의 addListeners (GenericFutureListener는 <? 연장 ? 미래 < 슈퍼 보이드 >> ... 리스너); 

    @Override 
    ChannelFuture의 removeListener (GenericFutureListener는 <? 확장 미래를 <? 슈퍼 무효 >>경청자); 

    @Override 
    ChannelFuture removeListeners (GenericFutureListener는 <? 연장 ? 미래 < 슈퍼 보이드 >> ... 리스너); 

    @Override 
    ChannelFuture 동기화 () 가 발생 예외 : InterruptedException 단계; 

    @Override 
    ChannelFuture syncUninterruptibly (); 

    @Override 
    ChannelFuture ()이 기다린다 발생 예외 : InterruptedException 단계; 

    @Override 
    ChannelFuture awaitUninterruptibly (); 
}

三, 약속

  미래가 그물코 약속이 미래를 확장 사용, 인터페이스의 쓰기 작업을 지원하지 않기 때문에 약속이 미래를 계승, 쓰기 가능한 미래입니다, 비동기 작업 결과를 설정할 수 있습니다.

공중  인터페이스 약속 <V> 를 확장 미래 <V> { 

    // 마크가 미래의 성공과 그 실행 결과가 제공되며, 모든 리스너를 통보
     // 작업이 실패 할 경우, 실패는 미래가되었습니다 것을 의미합니다 (예외가 발생합니다 그 결과, 성공의 결과 또는 실패 결과) 
    약속 <V> setSuccess (V 결과) 

    // 같은 대 setSuccess 방법하지만 실패 할 경우 오류가 예외를 발생 반환하지 
    부울 trySuccess (V 결과) 

    // 미래의 실패, 그리고 실패의 이유를 표시합니다.
    // 실패하면 (실패 결과가되었음을 의미)는 예외를 발생 
    약속 <V> ; setFailure (원인 Throwable입니다) 

    // 마크 미래 불량 및 고장의 원인이됩니다.
    // 이미 결과가있는 경우, false를 던지지 반환 
    부울 tryFailure을 (Throwable를 원인입니다); 

    //이 미래를 취소 할 수 없습니다 표시
    부울 setUncancellable (); 

    // 同ChannelFuture一样,返回이 
    @Override 
    약속 <V>의 addListener이 (? GenericFutureListener는 < 연장 ? 미래 < 슈퍼 V >> 리스너); 
    @Override 
    약속 <V>가 addListeners (? GenericFutureListener는 < 연장 ? 미래 < 슈퍼 V >> ... 리스너); 
    @Override 
    약속 <V>의 removeListener이 (? GenericFutureListener는 < 연장 ? 미래 < 슈퍼 V >> 리스너); 
    @Override 
    약속 <V> removeListeners (GenericFutureListener <확장 미래 <? 슈퍼 V >> ... 수신기); 

    @Override 
    약속 <V는> () 기다리고 발생 예외 : InterruptedException 단계; 
    @Override 
    약속 <V> awaitUninterruptibly (); 
    @Override 
    약속 <V> 동기화 () 가 발생 예외 : InterruptedException 단계; 
    @Override 
    약속 <V> syncUninterruptibly (); 
}

四, ChannelPromise

  ChannelPromise 기능을 함께 모아, ChannelFuture와 약속을 물려 받았다. 마찬가지로, 방법은 전화 ChannelPromise에 값을 반환합니다.

공중  인터페이스 ChannelPromise (가) 확장 ChannelFuture 약속을 <보이드> { 

    // 채널을 무시 () 메소드이 메소드가 변경되지 않은 사실을 ChannelFuture 
    @Override 
    채널 채널 (); 

    // 여러 방법 약속 인터페이스를 재정의 다음, 형식을 반환하는 것은 ChannelPromise입니다 
    @Override 
    ChannelPromise setSuccess (결과 무효) 
    ChannelPromise setSuccess (); 
    부울 trySuccess (); 
    @Override 
    ChannelPromise setFailure (원인이 Throwable입니다); 

    // 여기에 우리가 아래 코팅의 여러 가지 방법에 대해 잘 알고 있어야합니다 인스턴스의 ChannelPromise 유형 얻을 또한 쓰기 
    @Override 
    (GenericFutureListener을 ChannelPromise의 addListener를 <? 를 확장 미래는 <?슈퍼 >> 보이드 ) 수신기; 
    @Override 
    ChannelPromise의 addListeners (GenericFutureListener는 <? 연장 ? 미래 < 슈퍼 보이드 >> ... 리스너); 
    @Override 
    ChannelPromise의 removeListener은 (는 GenericFutureListener <? 연장 ? 미래 < 슈퍼 보이드 >> 리스너); 
    @Override 
    ChannelPromise removeListeners (GenericFutureListener는 <? 연장 ? 미래 < 슈퍼 보이드 >> ... 리스너); 

    @Override 
    ChannelPromise 동기화 () 가 발생 예외 : InterruptedException 단계; 
    @Override을
    ChannelPromise syncUninterruptibly (); 
    @Override 
    ChannelPromise ()이 기다린다 발생 예외 : InterruptedException 단계; 
    @Override 
    ChannelPromise awaitUninterruptibly (); 

    / ** 
     * 반환 새로운 { @link ChannelPromise} {경우 @link #isVoid ()} 반환 { @code 사실} 그렇지 않으면 그 자체.
     * / 
    // 我们忽略这个方法吧. 
    ChannelPromise의 unvoid (); 
}

 

  

추천

출처www.cnblogs.com/lovezmc/p/11547925.html