Schedulers.io

Schedulers.ioは、キャッシュされたスレッドで入出力する場合に使う。

Schedulers (RxJava Javadoc 1.3.8)

実行すると、

[1]:id = 1, name = main
[3]:id = 1, name = main
[2]:id = 11, name = RxIoScheduler-2
[4]:id = 11, name = RxIoScheduler-2
1
[4]:id = 11, name = RxIoScheduler-2
2
[4]:id = 11, name = RxIoScheduler-2
3
Completed!
[5]:id = 1, name = main

RxIoScheduler-2になっている。

Sample/rxjava/Schedulers/io/src/Schedulers at master · bg1bgst333/Sample · GitHub

Schedulers.computation

Schedulers.computationは、キャッシュされたスレッドで実行を意味する。
(ただし、入出力の場合はioの方がいい。)

Schedulers (RxJava Javadoc 1.3.8)

実行すると、

[1]:id = 1, name = main
[3]:id = 1, name = main
[2]:id = 14, name = RxComputationScheduler-1
[4]:id = 14, name = RxComputationScheduler-1
1
[4]:id = 14, name = RxComputationScheduler-1
2
[4]:id = 14, name = RxComputationScheduler-1
3
Completed!
[5]:id = 1, name = main

subscribeOnのみcomputation指定なので、発行も通知もRxComputationScheduler-1で実行されている。

Sample/rxjava/Schedulers/computation/src/Schedulers at master · bg1bgst333/Sample · GitHub

Schedulers.immediate

Schedulers.immediateは、現在のスレッドで即座に実行を意味する。

Schedulers (RxJava Javadoc 1.3.8)

実行すると、

[1]:id = 1, name = main
[3]:id = 1, name = main
[2]:id = 1, name = main
[4]:id = 1, name = main
1
[4]:id = 1, name = main
2
[4]:id = 1, name = main
3
Completed!
[5]:id = 1, name = main

全部mainスレッドで実行される。

Sample/rxjava/Schedulers/immediate/src/Schedulers at master · bg1bgst333/Sample · GitHub

Observable<T>.observeOn

Observable<T>.observeOnで、Observable<T>.subscribeに渡した通知処理スレッドのスケジューラをセットできる。

Observable (RxJava Javadoc 1.3.8)

発行は現在のスレッド、通知は新しいスレッド。

[1]:id = 1, name = main
[3]:id = 1, name = main
[2]:id = 1, name = main
[4]:id = 14, name = RxNewThreadScheduler-1
1
[4]:id = 14, name = RxNewThreadScheduler-1
2
[4]:id = 14, name = RxNewThreadScheduler-1
3
Completed!
[5]:id = 1, name = main

こういう風に全部出る場合もあるが、

[1]:id = 1, name = main
[3]:id = 1, name = main
[5]:id = 1, name = main
[2]:id = 11, name = RxComputationScheduler-1

こういう風に出ない場合もある。
(よく考えたら、メインスレッドで待っていないから、出し切れていないだけか。)
普通は、発行が新しいワーカースレッド、通知がメインUIスレッド、としたいが、AWTやSwingの場合、どれにすればいいのかわからないのが難点。
(computation、いやioっぽいけど・・・。)

Sample/rxjava/Observable_T/observeOn/src/Observable_T at master · bg1bgst333/Sample · GitHub

Observable<T>.subscribeOn

Observable<T>.subscribeOnで、Observable<T>.createに渡した発行処理スレッドのスケジューラをセットできる。

Observable (RxJava Javadoc 1.3.8)

キャッシュされたスレッド(I/O以外)で実行する場合は、Schedulers.computation()をセット。

[1]:id = 1, name = main
[3]:id = 1, name = main
[2]:id = 14, name = RxComputationScheduler-1
[4]:id = 14, name = RxComputationScheduler-1
[5]:id = 1, name = main
1
[4]:id = 14, name = RxComputationScheduler-1
2
[4]:id = 14, name = RxComputationScheduler-1
3
Completed!

発行処理も、通知処理も、RxComputationScheduler-1というスレッドで実行している。

Sample/rxjava/Observable_T/subscribeOn/src/Observable_T at master · bg1bgst333/Sample · GitHub

Thread.getName

Thread.getNameで、スレッド名を取得する。

Thread (Java Platform SE 6)

スレッドIDの取得からスレッド名の取得に差し替え。

こちらも。

CustomThread before.
[1]:Thread.currentThread.getName() = main
[2]:Thread.currentThread.getName() = main
[3]:Thread.currentThread.getName() = main
CustomThread after.
Thread.sleep before
[4]:Thread.currentThread.getName() = Thread-0
[5]:Thread.currentThread.getName() = Thread-0
Thread.sleep after

外側はmain、内側はThread-0、という名前になっている。

Sample/java/Thread/getName/src/Thread at master · bg1bgst333/Sample · GitHub

Thread.currentThread

Thread.currentThreadで、現在のスレッドの参照を取得できる。

Thread (Java Platform SE 6)

スレッドの内側と、スレッドの外側で、スレッドIDが違うことを確認する。

run内に2箇所。

生成前、生成後、実行後の3箇所。

CustomThread before.
[1]:Thread.currentThread.getId() = 1
[2]:Thread.currentThread.getId() = 1
[3]:Thread.currentThread.getId() = 1
CustomThread after.
Thread.sleep before
[4]:Thread.currentThread.getId() = 9
[5]:Thread.currentThread.getId() = 9
Thread.sleep after

外側はスレッドIDが1、内側はスレッドIDが9。

Sample/java/Thread/currentThread/src/Thread at master · bg1bgst333/Sample · GitHub