関連記事:【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
関数を使うと良い。
/以上