Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
await() / Deferred
Kotlinコルーチンの『Deferred<T>』は非同期処理の結果を保持するオブジェクトで、『await()』を呼ぶと結果が出るまでコルーチンを中断して待機します。
構文
// async で Deferred を取得
val deferred: Deferred<型> = async {
// 非同期処理
結果 // 戻り値
}
// await で結果を取得(コルーチン内でのみ呼び出せます)
val result: 型 = deferred.await()
// awaitAll で複数の Deferred を一括待機
val results: List<型> = awaitAll(deferred1, deferred2, deferred3)
メソッド一覧
| メソッド / プロパティ | 概要 |
|---|---|
| deferred.await() | 結果が出るまでコルーチンを中断して結果を返します。 |
| awaitAll(vararg deferred) | 複数の Deferred を並行待機して結果のリストを返します。 |
| deferred.isCompleted | 処理が完了しているか確認します。 |
| deferred.isCancelled | キャンセルされているか確認します。 |
| deferred.cancel() | 非同期処理をキャンセルします。 |
| deferred.getCompleted() | 完了済みの場合に結果を取得します(未完了なら例外)。 |
サンプルコード
import kotlinx.coroutines.*
suspend fun fetchUser(id: Int): String {
delay(200)
return "User-$id"
}
suspend fun fetchScore(id: Int): Int {
delay(150)
return id * 100
}
fun main() = runBlocking {
// 2つの非同期処理を並行して起動します。
val userDeferred = async { fetchUser(1) }
val scoreDeferred = async { fetchScore(1) }
// それぞれの結果を await で取得します。
val user = userDeferred.await()
val score = scoreDeferred.await()
println("$user: $score点") // User-1: 100点
// awaitAll で複数の結果を一括取得します。
val deferreds = (1..3).map { id ->
async { fetchUser(id) }
}
val users = awaitAll(*deferreds.toTypedArray())
println(users) // [User-1, User-2, User-3]
// isCompleted で完了チェック
val d = async { delay(500); "done" }
println(d.isCompleted) // false(まだ実行中)
d.await()
println(d.isCompleted) // true
}
概要
複数の『async』を起動してから後でまとめて『await()』を呼ぶことで並列実行が実現します。『async』直後に『await()』を呼ぶと順次実行になるため注意してください。
複数の Deferred をまとめて待つには『awaitAll()』が便利です。いずれか1つが例外を投げると他もキャンセルされます。
コルーチンの起動方法はlaunch / asyncを、タイムアウトはdelay() / withTimeout()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。