コルーチンの基本

Kotlinにおけるコルーチン(Coroutine)の基本について、以下のように詳しく説明します。


コルーチンとは?

コルーチンは、軽量な非同期処理の手段としてKotlinが提供する機能です。従来のスレッドよりも少ないメモリで、効率的な並行処理(concurrent programming)を実現することができます。

Kotlinのコルーチンは、**中断可能(suspendable)**な関数として動作し、非同期コードをシンプルで直感的な同期的スタイルで記述できるようになります。


コルーチンの主な特徴

特徴 説明
軽量スレッド スレッドのように並列に動作するが、実体は1つのスレッド上で複数のコルーチンが切り替わるため効率的。
中断可能な関数(suspend 長時間の処理(ネットワーク、I/Oなど)を中断して、他の処理にCPUを譲ることができる。
構造化並行性 親子関係を持ったスコープでコルーチンを管理し、予期しないメモリリークやキャンセル漏れを防止できる。

コルーチンの基本構文

Kotlinのコルーチンを使うには、以下の2つの要素が重要です:

  1. suspend 関数

  2. コルーチンスコープ(例:runBlocking, launch, async

kotlin
import kotlinx.coroutines.* fun main() = runBlocking { // メインスレッドをブロックしてコルーチン開始 launch { delay(1000L) // 1秒中断(非ブロッキング) println("World!") } println("Hello,") // 先に表示される }

解説

  • runBlocking:通常の関数やmain()内でコルーチンを開始するためのブロッキングなスコープ。

  • launch:新しいコルーチンを起動(戻り値はJob型)。

  • delay:指定ミリ秒間中断するsuspend関数(Thread.sleep()とは異なりスレッドをブロックしない)。


主なビルダー関数

関数名 説明
launch 戻り値なし。Jobを返す。主に副作用のある非同期処理に使用。
async 値を返す非同期処理に使用。戻り値はDeferred<T>await()で結果を取得。
runBlocking ブロッキングなスコープを作成。主にmain()やテストで使用。

suspend関数の定義例

kotlin
suspend fun fetchData(): String { delay(2000) // 非同期で2秒中断 return "データ取得完了" }

suspend関数は通常の関数から直接呼び出すことはできず、必ずコルーチンの中から呼び出す必要があります。


コルーチンとスレッドの違い

比較項目 コルーチン スレッド
起動コスト 非常に小さい 高い(OSリソースが必要)
同時実行数 数千〜数万可能 数百が限界
コンテキスト切替 高速(ユーザー空間) 遅い(カーネル空間)

まとめ

  • コルーチンはKotlinで非同期処理をシンプルに実装するための仕組みです。

  • launch, async, runBlocking などを使ってコルーチンを管理します。

  • suspend関数は非同期的に中断・再開が可能で、I/Oやネットワーク処理に適しています。

  • 構造化並行性によって、安全で可読性の高い並行処理が実現できます。

生成日:2025/05/04