2015-01-23 1 views
4

RxJava로 리 액티브 프로그래밍을 배우고 단일 실행 스레드에서 마우스 블로킹과 동시에 emmited 값을 소비하려고합니다.옵저버가 동시에 소모 한 값 소모

 Observable 
      .interval(50, TimeUnit.MILLISECONDS) 
      .take(5) 
      .subscribe(new Action1<Long>() { 
       @Override 
       public void call(Long counter) { 
        sleep(1000); 
        System.out.println("Got: " + counter + " thread : "+ Thread.currentThread().getName()); 
       } 
      }); 

    sleep(10000); 

나는

Got: 0 thread : RxComputationThreadPool-1 
Got: 1 thread : RxComputationThreadPool-1 
Got: 2 thread : RxComputationThreadPool-1 
Got: 3 thread : RxComputationThreadPool-1 
Got: 4 thread : RxComputationThreadPool-1 

가 어떻게 비동기의 각 이벤트를 처리 할이 출력을 얻을 것이다? 수신이

Got: 0 thread : RxComputationThreadPool-1 
Got: 1 thread : RxComputationThreadPool-2 
Got: 2 thread : RxComputationThreadPool-3 
Got: 3 thread : RxComputationThreadPool-4 
Got: 4 thread : RxComputationThreadPool-5 

답변

4

같은 관측은 그래서 서로에 대해 동시에 알림을 처리하기 위해, 동시성 1 대표, 당신은 관찰에 각각 통지를 투영해야합니다.

flatMap은 비동기 순차 작곡 연산자입니다. 그것은 관찰 가능 소스에서 각 통지를 관찰 가능으로 투영하므로 각 입력 값을 동시에 처리 할 수 ​​있습니다. 그런 다음 각 계산 결과를 겹치지 않는 알림이 포함 된 병합 된 관찰 가능 시퀀스로 병합합니다.

부록 : flatMap에 대한 selector에서

종종 대상 플랫폼에 따라 동시 관찰을 만드는 여러 가지 방법이 있습니다. Java는 잘 모르지만 .NET에서는 일반적으로 Observable.Start을 사용하여 동시성을 도입하거나 비동기 메서드 (async/await)를 사용하여 원시 비동기를 활용하는 것이 좋을 수 있습니다. 대신 관찰 가능한의 관점에서 생각하는 것이 편리 비록

1 기술적으로 차가운 관찰에 대한 개별 가입 (관찰자), 수신의 동시성을 가능하게한다. 자세한 내용은 this answer을 참조하십시오.

+0

원하는 동작을 얻으려면 내가해야 할 변경 사항을 제안 할 수 있습니까? 실제 예제로 이해하는 것이 훨씬 쉬울 것이라고 생각합니다 ... – vach

+1

죄송합니다, Java는 모르지만 .NET에서는'xs.FlatMap (x => ProcessAsync (x))와 유사합니다.)'이며, 여기서'ProcessAsync'는'x'를 인수로 받아들이고 어떤 타입의 관찰 가능을 반환하는 메소드입니다. 'ProcessAsync'에 대한 각 호출의 반환 값을 처리 할 필요가 없다고 가정하면 부작용만을위한 매개 변수없이'Subscribe'를 호출 할 수도 있습니다. –

+1

몇 가지 추가 정보를 포함하도록 답변을 업데이트했습니다. –