조금 더 자세한 설명부탁드립니다
해당 강의에서 추가 설명에 대해 이해가 되지 않아서 조금 더 자세한 설명 부탁드립니다.
우선, 제가 임의로 아래 코드처럼 main 스레드를 0.5초 동안 일시 정지를 적용 시켜보았더니 정상적으로 동작했습니다.
- UnitTestNotByRxJava.java (Test)
public class UnitTestNotByRxJava {
@Test
public void getCarMakerStreamSyncTest(){
List<CarMaker> carMakerList = new ArrayList<>();
SampleObservable.getCarMakerStream()
.subscribe(data -> carMakerList.add(data));
TimeUtil.sleep(500L);
assertThat(carMakerList.size(), is(5));
}
}
- SampleObservable.java
public class SampleObservable {
...
public static Observable<CarMaker> getCarMakerStream() {
Observable<CarMaker> observable =
Observable.fromArray(SampleData.carMakers)
.subscribeOn(Schedulers.computation());
return observable;
}
...
}
즉, 기존 예제에서 오류가 나는 이유가, main 스레드와 호출 함수 getCarMakerStream 내 'RxComputationThreadPool' 스레드가 동시에 실행이 되어 그 짧은 시간 사이에 main 스레드에서 결과 값을 리턴받지 못하기 때문이다라고 이해하면 될까요?
回答 2
1
안녕하세요? 질문 주신 부분에 대해서 답변을 드리겠습니다.
"즉, 기존 예제에서 오류가 나는 이유가, main 스레드와 호출 함수 getCarMakerStream 내 'RxComputationThreadPool' 스레드가 동시에 실행이 되어 그 짧은 시간 사이에 main 스레드에서 결과 값을 리턴받지 못하기 때문이다라고 이해하면 될까요?"
말씀하신 내용과 거의 비슷한데요. main 쓰레드와 RxComputationThreadPool 쓰레드가 동시에 실행되는 것이 아니라 RxComputationThreadPool 쓰레드에서 실행되는 RxJava 코드보다 main 쓰레드에서 실행되는 assertThat 코드가 먼저 실행이 되기때문에 테스트에 실패하는것입니다.
그래서 질문자님이 0.5초 딜레이를 준 그 시점에는 아래쪽 assertThat 코드가 실행이 되지 않고, 윗쪽의 RxJava 코드가 먼저 실행이 되는 것입니다.
답변이 충분한지 모르겠네요. ^^;
0
답변 감사합니다!
제가 test가 아닌 환경에서 해당 예제를 가지고 assertThat( ) 메소드를 제외하고 실행시켜 보아도 subscribe( ) 메소드에 결과가 나오지 않더라구요
이것도 RxComputationThreadPool로부터의 데이터를 통지도 하기 전에 main 스레드에서의 작업이 끝나서 결과 값이 안나온 것이군요?
List<CarMaker> carMakerList = new ArrayList<>();
SampleObservable.getCarMakerStream()
.map(data -> carMakerList.add(data))
.subscribe(data -> Logger.log(LogType.ON_NEXT, carMakerList));
// TimeUtil.sleep(1000L);
- 스레드 지연 시간 적용 시 결과
onNext() | RxComputationThreadPool-1 | 22:51:26.875 | [CHEVROLET] onNext() | RxComputationThreadPool-1 | 22:51:26.877 | [CHEVROLET, HYUNDAE] onNext() | RxComputationThreadPool-1 | 22:51:26.877 | [CHEVROLET, HYUNDAE, SAMSUNG] onNext() | RxComputationThreadPool-1 | 22:51:26.878 | [CHEVROLET, HYUNDAE, SAMSUNG, SSANGYOUNG] onNext() | RxComputationThreadPool-1 | 22:51:26.878 | [CHEVROLET, HYUNDAE, SAMSUNG, SSANGYOUNG, KIA]
0
"이것도 RxComputationThreadPool로부터의 데이터를 통지도 하기 전에 main 스레드에서의 작업이 끝나서 결과 값이 안나온 것이군요?"
네, 맞습니다. 그렇기때문에 interval( ) 연산자의 경우 디폴트 실행 쓰레드가 main 쓰레드가 아니기때문에 main 쓰레드에 약간의 지연 시간을 주어야 정상적으로 실행이 됩니다.
Single과 관련해 여쭤보고 싶은 부분이 있습니다!
0
264
2
cold/hot publisher 예제 코드와 관련해 질문 드립니다.
0
363
1
CompletableObserver 클래스의 람다식 표현관련
0
297
1
1강에 예시로 보여주신 ToDoSample 코드에 관해 질문 드립니다!
0
356
1
[질문] cascading operator 설명하실 때
2
614
1
_get 함수 부분이 너무 이해가 안갑니다 ㅠ
0
656
2
초급자 질문
0
501
1
CachedNetworkImage 로 인한 memory leak 문제..
0
943
2
병렬평가 질문 있습니다!
0
428
1
함수를 분리하지 않고 실행하게 되면 순환참조 오류가 발생합니다...
0
621
1
rxjs 와 차이점
0
567
1
거르기 함수 중 compact 질문드립니다.
0
475
1
return 있고 없고 차이 질문드립니다...!
0
1062
3
강의 잘봤습니당
0
452
1
이것이 왜 실행이 안되는지 여쭙고 싶네요.
0
2792
1
초급강의를 수강할때 질문입니다.
0
469
1
실무에서 SSE 서비스 구성 시 컴포넌트와 아키텍처 문의
0
421
1
doOnComplete, doOnError 는 왜 필요한가요?
0
807
1
예제에서 Runnable 용도
0
230
1
스프링 웹플럭스 강의는 안하시나요?
0
1232
1
Schedulers.computation()에 관하여
0
471
5
DoOnDisposeExample 예제에서의 스레드 관련 질문 (자문자답)
0
224
1
SSE 실습 소스코드 위치 문의
1
486
1
blockingXXXX 함수들은 테스트용도로만 사용하는건가요?
2
224
1

