Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
launch / async
Kotlinコルーチンの『launch』は結果を返さない並行処理の起動に、『async』は結果を返す並行処理の起動に使います。どちらも『CoroutineScope』内で非同期に実行されます。
構文
// launch — 結果なし(Job を返す)
val job: Job = スコープ.launch {
// 非同期処理(戻り値なし)
}
job.join() // 完了まで待機
// async — 結果あり(Deferred<T> を返す)
val deferred: Deferred<String> = スコープ.async {
"結果" // 戻り値
}
val result = deferred.await() // 結果を取得(中断)
構文一覧
| 関数 | 概要 |
|---|---|
| launch { } | 結果を返さないコルーチンを起動します。『Job』を返します。 |
| async { } | 結果を返すコルーチンを起動します。『Deferred<T>』を返します。 |
| job.join() | Job の完了まで現在のコルーチンを中断します。 |
| job.cancel() | Job をキャンセルします。 |
| deferred.await() | Deferred の結果が出るまで現在のコルーチンを中断します。 |
| Dispatchers.IO | I/O 処理向けのスレッドプールで実行します。 |
| Dispatchers.Default | CPU 集約処理向けのスレッドプールで実行します。 |
サンプルコード
import kotlinx.coroutines.*
fun main() = runBlocking {
// launch — 結果を返さない並行処理
val job1 = launch {
delay(300)
println("job1 完了")
}
val job2 = launch {
delay(100)
println("job2 完了")
}
job1.join() // job1 の完了を待ちます。
job2.join()
// job2 完了(先)、job1 完了(後)の順に出力されます。
// async — 結果を返す並行処理(並列実行)
val deferred1 = async {
delay(200)
"結果A"
}
val deferred2 = async {
delay(100)
"結果B"
}
// 両方を同時に実行して結果をまとめて取得します。
println("${deferred1.await()}, ${deferred2.await()}")
// 結果A, 結果B(約200msで完了)
// Dispatchers.IO で I/O 処理を別スレッドで実行します。
val ioResult = async(Dispatchers.IO) {
// ファイル読み込みやネットワーク通信をここで行います。
"IOの結果"
}
println(ioResult.await()) // IOの結果
}
概要
『launch』と『async』の使い分けは戻り値が必要かどうかで決まります。結果が不要な場合は『launch』、結果を取得したい場合は『async』と『await()』を使います。
複数の『async』を並行して起動し、後でまとめて『await()』を呼ぶパターンが一般的です。順番に呼ぶと順次実行になりますが、起動してから後でまとめて待つことで並列実行になります。
中断可能な関数の定義はsuspend 関数を、待機とタイムアウトはdelay() / withTimeout()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。