関連記事:【Android】Looper を持つスレッドの CoroutineDispatcher を作る
CoroutineDispatcher として、kotlinx-coroutines-core には Dispatchers.Default と Dispatchers.IO が用意されている。
ほとんどの場合はこれらで事足りる。
しかしスレッドセーフでないオブジェクトを排他制御することなく安全に扱うためにシングルスレッドの CoroutineDispatcher が欲しい場合など、
独自のスレッドやスレッドプールからなる CoroutineDispatcher が欲しいことがある。
Kotlin/JVM であれば ExecutorService オブジェクトに対して拡張関数 asCoroutineDispatcher を呼ぶことで簡単に作ることができる。
また、Executors クラスを使うことでさまざまな ExecutorService オブジェクトを簡単に作ることができる。
シングルスレッドの CoroutineDispatcher を作る
import kotlinx.coroutines.*
import java.util.concurrent.Executors
val singleThreadDispatcher: CoroutineDispatcher =
Executors.newSingleThreadExecutor()
.asCoroutineDispatcher()
動作確認
var i = 0
runBlocking {
repeat(1000) {
launch(singleThreadDispatcher) {
++i
}
}
}
println(i) // > 1000
スレッドプールの CoroutineDispatcher を作る
import kotlinx.coroutines.*
import java.util.concurrent.Executors
val threadPoolDispatcher: CoroutineDispatcher =
Executors.newCachedThreadPool()
.asCoroutineDispatcher()
動作確認
var i = 0
runBlocking {
repeat(1000) {
launch(threadPoolDispatcher) {
++i
}
}
}
println(i) // > 993
なお、並列数を固定にしたスレッドプールを作りたければ
Executors.newCachedThreadPool 関数に代えて Executors.newFixedThreadPool 関数を使うと良い。
/以上