1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Kotlin/JVM】CoroutineDispatcher を作る

Last updated at Posted at 2021-09-14

関連記事:【Android】Looper を持つスレッドの CoroutineDispatcher を作る

CoroutineDispatcher として、kotlinx-coroutines-core には Dispatchers.DefaultDispatchers.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 関数を使うと良い。

/以上

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?