今まで、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いまいち分からないって方はぜひ見てみてください!
参考