tkt989 🍵 ブログ

日々のメモ

Kotlin Coroutineをすこしかじってみた

2018/10/21

簡単な使い方

fun task() {
  GlobalScope.launch {
    print("World")
  }
  print("Hello")
}

task() // => "HelloWorld"

GlobalScope.launchのブロックがコルーチンとして実行されます。 コルーチンの中で使える関数はdelayなどがあります。

suspend function

コルーチンの中でのみ実行できるメソッドをsuspend functionといいます。

fun task() {
  GlobalScope.launch {
    delay(1000L)
  }
  delay(1000L) // コルーチン外なのでコンパイルエラー
}

delayのような標準ライブラリのsuspend functionもありますが、suspendを付けることで定義することもできます。

suspend fun doReturnStatus(): Int {
  delay(1000L)
  return 200
}

suspend functionはコルーチンの中でしか呼べない、言い換えればsuspend functionの処理は常にコルーチン上で行われるのでsuspend functionの中で別のsuspend function(ここではdelay)を呼ぶことができます。

async

GlobalScope.launchと似ているがasyncDeferredを返す。 Deferred.await()で結果を待つ。

GlobalScope.launch {
    val task3 = async {
        delay(1000L)
        return@async "3"
    }
    val task2 = async {
        delay(2000L)
        return@async "2"
    }

    println("${task2.await()}")
    println("${task3.await()}")
}
println("1")

// Output:
// 1
// 2
// 3

最初はlaunchによってコルーチンが始まります。 しかし、メインスレッドは止まらないので直後のprintln(``"``1``"``)が実行されます。 その後、コルーチンのブロックが実行されます。 delay秒数により、task3のほうが早く終わりますが、task2のawait()を呼んでいるので、task2の終了を待ちます。 その結果、出力は1,2,3になります。