Rxjava Schedulers.newThread () 대 Schedulers.io ()로 개조


84

어떻게 사용하는 혜택이다 Schedulers.newThread()Schedulers.io()에서 Retrofit네트워크 요청. 를 사용하는 많은 예를 보았지만 그 io()이유를 이해하고 싶습니다.

예시 상황 :

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())...

vs

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())...

내가 본 이유 중 하나는-

newThread()각 작업 단위에 대한 새 스레드를 만듭니다. io()스레드 풀을 사용합니다.

하지만 그 주장이 앱에 미치는 영향은 무엇일까요? 그리고 어떤 다른 측면이 있습니까?

답변:


99

사용의 이점은 Schedulers.io()스레드 풀을 사용하는 반면 사용 Schedulers.newThread()하지 않는다는 사실에 있습니다 .

스레드 풀 사용을 고려해야하는 주된 이유는 유휴 상태이고 작업을 기다리는 미리 작성된 여러 스레드를 유지하기 때문입니다. 즉, 수행 할 작업이있을 때 스레드를 만드는 오버 헤드를 겪을 필요가 없습니다. 작업이 완료되면 해당 스레드는 지속적으로 스레드를 생성하고 파괴하는 대신 향후 작업을 위해 재사용 할 수도 있습니다.

스레드를 만드는 데 비용이 많이들 수 있으므로 즉석에서 만드는 스레드 수를 최소화하는 것이 일반적으로 좋습니다.

스레드 풀에 대한 자세한 내용은 다음을 권장합니다.


4
일부 사용 사례에는 적합하지 않을 수있는 제한없는 스레드 풀을 기반으로하는 Scheduler.io ()에 대한 주석을 추가 할 가치가 있습니다. 참조 stackoverflow.com/questions/31276164/...
데이브 Moten

@DaveMoten 스레드 풀에 부적절한 사용 사례는 무엇입니까 Schedulers.io?
IgorGanapolsky

3
동시 작업이 많은 경우 Schedulers.io()OS i / o 제한에 부딪 힐 수 있습니다 (예 : 최대 열린 파일 수, 안정성을 위해 폐기 된 후에도 일정 기간 동안 열린 상태로 유지 될 수있는 최대 tcp 연결 수). . 또한 각각의 새 스레드에는 RAM이 부족할 수 있도록 최소한의 RAM (> 512K이지만 1M에서 작동)이 필요합니다.
Dave Moten

해당 스레드가 동일한 메모리를 공유합니까? 예를 들어 하나의 io 스레드에서 생성되고 다른 io 스레드에서 액세스되는 객체.
Eido95

1
@ Eido95는 동일한 스택이 아닌 동일한 힙을 공유합니다. 변수에 관한 한 예, 스레드간에 변수를 공유 할 수 있습니다 (이러한 변수가 스레드로부터 안전한지 확인하는 모든 일반적인 경고와 함께).
Bryan Herbst
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.