5
0

More than 1 year has passed since last update.

Kotlinのyield関数についてまとめてみる

Last updated at Posted at 2022-02-26

今まで、KotlinのCoroutineを書いている中での時々登場する、yieldがなにをやっているのかいまい理解せずになんとなくで、書いていたのでyieldについて調べてみました。

Sequenceで使うyield()もありますが、今回はCoroutineのyieldについてです

yield関数とは?

yield関数は、KotlinのCoroutineのsuspend関数です。

yieldを使うとどうなるのか?

yieldを使うと、例えば複数のCoroutineを同時に実行しているときに、どれか一つが時間のかかる重い処理だった場合に、他のCoroutineに対して実行を譲ることができる関数です。

(コメントで指摘いただきありがとうございます。)
複数のスレッドを持っている場合、スレッドを譲った前と後でスレッドが異なっている場合があるので、そこを注意する必要があります。

コードで書くとこんな感じです。

fun main() {
    runBlocking {
        launch {
            while (i < threshold) {
                if (i % 2 == 0) {
                    println("$i is even")
                }
                i++
                yield()
            }
        }

        launch {
            while (i < threshold) {
                if (i % 2 != 0) {
                    println("$i is odd")
                }
                i++
                yield()
            }
        }
    }
}

出力

0 is even
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd

この例では、まず最初に0を出力した後に、yieldを使用することで、最初の処理から二つ目の処理に実行が譲ることができています。もし、一つ目の処理中にyieldがなければ実行結果はこうなります。

0 is even
2 is even
4 is even
6 is even
8 is even

最後に

Coroutineについて、まだまだ自分自身知らないことだらけなので、これから勉強する必要があると強く感じました。
参考文献の本はすごくわかりやすくCoroutineについて書いてあるので、Coroutineいまいち分からないって方はぜひ見てみてください!

参考

5
0
2

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
5
0