Skip to content
Update Kotlin coroutines authored by umaumax's avatar umaumax
......@@ -157,10 +157,31 @@ val result = withContext(Dispatchers.Default) {
println(result)
```
## コルーチンの並列度
## コルーチンの挙動
### コルーチンの非同期タスクがクロージャのときの変数の挙動
共通した変数をキャプチャーした場合はすべてのasyncブロックの非同期タスクで値を共有している
asyncブロックの非同期タスクの中で`yield()``delay()`を実行するとコルーチンの切り替えのタイミングとなる
逆に、この切り替えのタイミングが無い限りは切り替わらない
``` kotlin
for (i in 1..100) {
val pre_x = x
// この切り替えタイミングで`x`が他のコルーチンで参照されて値が更新される可能性がある
yield() // or delay(1)
x += 1
if (pre_x + 1 != x) {
exitProcess(1)
}
}
```
c++のように、mutexなどを利用したlock/unlockは不要であるが、切り替えタイミングによって、値が意図せずに変更される可能性があることに注意する必要がある
### コルーチンの並列度
rustのtokioと同じように明示的に別のスレッドを利用しない限り、コルーチンの同時実行数は1である
## スレッドプールを作成してコルーチンを実行する例
### スレッドプールを作成してコルーチンを実行する例
``` kotlin
import kotlinx.coroutines.*
......@@ -214,7 +235,7 @@ Job Fuga: 8, thread: FugaThread-1(id:15)
Job Fuga: 9, thread: FugaThread-1(id:15)
```
## 単一のスレッドでコルーチンを実行する
### 単一のスレッドでコルーチンを実行する
`@OptIn`が必要となるので、`val dispatcher = newFixedThreadPoolContext(1, "HogeThread")`としたほうがよいかもしれない
これは単一のスレッドで実行することで、コルーチンで安全に変数を操作できる(主にUIアプリケーションで使わている)
......@@ -231,7 +252,7 @@ fun main(args: Array<String>) = runBlocking {
}
```
## コンテキストの切り替えタイミング
### コンテキストの切り替えタイミング
連続して複数のasyncタスクをawaitで待ち受けるときにasyncブロックの非同期タスクの冒頭で、`yield()``delay()`を利用して切り替えるタイミングの有無で挙動が変わる
例えば、切り替えタイミングがない場合は
......
......