Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

Channel

KotlinのChannelはコルーチン間でデータをやり取りするための通信チャネルです。送信側は『send()』でデータを送り、受信側は『receive()』または『for』ループで受け取ります。

構文
import kotlinx.coroutines.channels.*

// Channel の作成
val channel = Channel<型>()
val buffered = Channel<型>(capacity = 10)  // バッファ付き

// 送信
channel.send(値)      // バッファが満杯なら中断して待機

// 受信
val value = channel.receive()   // データが来るまで中断して待機
channel.close()                 // チャネルを閉じる

// for ループで全データを受信
for (v in channel) {
    println(v)
}

// produce コルーチンビルダー
val ch = produce<型> {
    send(値)
}
関数一覧
関数 / プロパティ概要
Channel(capacity)チャネルを作成します。デフォルトはバッファなし(ランデブー)です。
channel.send(value)値を送信します。バッファが満杯なら空くまで中断します。
channel.receive()値を受信します。データが来るまで中断します。
channel.close()チャネルを閉じます。以降の受信は残データを処理後に終了します。
channel.isClosedForSend送信が閉じているか確認します。
produce { send() }送信専用チャネルを持つコルーチンを起動します。
サンプルコード
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    // 基本的な送受信
    val channel = Channel<Int>()

    // 送信コルーチン
    launch {
        for (i in 1..5) {
            channel.send(i)
            println("送信: $i")
        }
        channel.close()  // 送信完了後にチャネルを閉じます。
    }

    // 受信(for ループで閉じるまで受け取り続けます)
    for (value in channel) {
        println("受信: $value")
    }

    // produce ビルダーで送信専用チャネルを作ります。
    val squares = produce {
        for (i in 1..4) {
            send(i * i)
        }
    }
    squares.consumeEach { println("2乗: $it") }
    // 2乗: 1, 4, 9, 16

    println("完了")
}
概要

Channelはコルーチン間の「パイプ」として機能します。バッファなし(デフォルト)の場合、送受信が揃った瞬間にデータが渡されます(ランデブー)。バッファ付きチャネルはキューとして動作し、バッファが満杯になるまで送信はブロックされません。

チャネルを『close()』しないと受信側がいつまでも待ち続けます。『produce』ビルダーはブロックが終わると自動でチャネルを閉じるため、送信専用の用途には便利です。

コルーチンの起動はlaunch / asyncを、非同期データストリームはFlow — 基本を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。