[java] RxJava의 스케줄러(Scheduler)

RxJava는 비동기 프로그래밍을 위한 라이브러리로, 스케줄러(Scheduler)라는 개념을 제공합니다. 스케줄러는 작업을 실행할 스레드를 지정하고, 동시에 실행되는 작업의 순서를 관리하며, 작업의 실행 시점을 제어하는 역할을 합니다. 이번 글에서는 RxJava의 기본 스케줄러에 대해 알아보겠습니다.

1. Schedulers.io()

Schedulers.io()는 I/O 작업을 수행하는데 적합한 스케줄러입니다. 이 스케줄러는 네트워킹, 파일 입출력 등의 I/O 작업을 처리하기 위해 고려된 스레드 풀을 사용합니다. 따라서 CPU 작업이 아닌 I/O 작업에 적합한 성능을 보여주며, 작업이 큐에 적재된 순서대로 처리됩니다.

Observable.just("Hello")
    .observeOn(Schedulers.io())
    .subscribeOn(Schedulers.io())
    .subscribe(result -> {
        // I/O 작업 수행
    });

2. Schedulers.computation()

Schedulers.computation()은 CPU 작업을 수행하는데 적합한 스케줄러입니다. 이 스케줄러는 고정 크기의 스레드 풀을 사용하며, CPU 코어의 개수에 맞추어 최적화된 작업 스레드를 할당합니다. 따라서 CPU 작업에 적합한 성능을 보여주며, 작업이 큐에 적재된 순서와 상관없이 동시에 처리됩니다.

Observable.just("Hello")
    .observeOn(Schedulers.computation())
    .subscribeOn(Schedulers.computation())
    .subscribe(result -> {
        // CPU 작업 수행
    });

3. Schedulers.newThread()

Schedulers.newThread()는 새로운 스레드를 생성하여 작업을 처리하는 스케줄러입니다. 매번 호출될 때마다 새로운 스레드를 생성하므로, 많은 수의 작업을 동시에 처리하는 경우 성능이 저하될 수 있습니다. 그러나 각 작업이 완전히 독립적인 경우에는 유용하게 사용할 수 있습니다.

Observable.just("Hello")
    .observeOn(Schedulers.newThread())
    .subscribeOn(Schedulers.newThread())
    .subscribe(result -> {
        // 작업 수행
    });

4. Schedulers.single()

Schedulers.single()은 단일 스레드에서 작업을 처리하는 스케줄러입니다. 작업 큐에 있는 작업이 순차적으로 처리되며, 새로운 작업이 큐에 적재될 때까지 이전 작업이 완료됩니다. 따라서 순서가 중요한 작업에 적합한 스케줄러입니다.

Observable.just("Hello")
    .observeOn(Schedulers.single())
    .subscribeOn(Schedulers.single())
    .subscribe(result -> {
        // 작업 수행
    });

5. Schedulers.trampoline()

Schedulers.trampoline()은 현재 실행중인 스레드에서 작업을 처리하는 스케줄러입니다. 작업이 즉시 실행되지 않고 작업 큐에 적재되며, 이전 작업이 완료된 후 순차적으로 실행됩니다. 따라서 순차적인 작업 흐름이 필요한 상황에 적합합니다.

Observable.just("Hello")
    .observeOn(Schedulers.trampoline())
    .subscribeOn(Schedulers.trampoline())
    .subscribe(result -> {
        // 작업 수행
    });

위에서 소개한 스케줄러들은 RxJava에서 제공하는 일부 기본 스케줄러입니다. 각각의 특징과 사용 사례에 맞게 적절히 선택하여 비동기 작업을 처리할 수 있습니다.