Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
suspend 関数
Kotlinの『suspend』関数はコルーチン内で実行できる中断可能な関数です。処理を一時停止して他の処理を実行させ、完了後に再開できるため、非同期I/Oや並行処理を簡潔に書けます。
構文
// suspend 関数の定義
suspend fun 関数名(引数: 型): 戻り値型 {
// コルーチン内でのみ呼び出せます
delay(1000) // 1秒待機(スレッドをブロックしない)
return 結果
}
// suspend 関数の呼び出し(コルーチンスコープ内から)
runBlocking {
val result = 関数名(引数)
}
構文一覧
| キーワード / 関数 | 概要 |
|---|---|
| suspend fun | 中断可能な関数を定義します。コルーチン内からのみ呼び出せます。 |
| runBlocking { } | コルーチンを起動して完了まで現在スレッドをブロックします。テスト・main 関数で使います。 |
| coroutineScope { } | 子コルーチンが全て完了するまで中断(スレッドはブロックしない)します。 |
| delay(ms) | 指定ミリ秒間コルーチンを中断します(スレッドをブロックしません)。 |
| withContext(Dispatcher) { } | コルーチンのコンテキスト(スレッド)を切り替えて処理を実行します。 |
サンプルコード
import kotlinx.coroutines.*
// suspend 関数の定義
suspend fun fetchData(id: Int): String {
delay(500) // ネットワーク通信を模倣(0.5秒待機)
return "Data-$id"
}
suspend fun processData(data: String): String {
delay(200) // 処理時間を模倣
return data.uppercase()
}
fun main() = runBlocking {
println("開始")
// suspend 関数を順番に呼び出します。
val data = fetchData(1)
println("取得: $data") // 取得: Data-1
val result = processData(data)
println("処理後: $result") // 処理後: DATA-1
// coroutineScope で子コルーチンをまとめます。
coroutineScope {
val a = fetchData(2)
val b = fetchData(3)
println("$a, $b") // Data-2, Data-3
}
println("完了")
}
概要
『suspend』関数はコルーチン内またはほかの『suspend』関数からのみ呼び出せます。通常の関数から呼び出すには『runBlocking』や『launch』でコルーチンスコープを作る必要があります。
『delay()』はスレッドをブロックしないため、『Thread.sleep()』の代わりに使います。コルーチン内では多数の『suspend』関数を並行して起動することで、少ないスレッドで高いスループットを実現できます。
コルーチンの並行起動はlaunch / asyncを、非同期結果の取得はawait() / Deferredを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。