import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
val channel = Channel<Int>(2)
fun main() = runBlocking<Unit> {
launch {
var x = 1
while (x <= 10) {
channel.send(x++)
}
//重点:close方法并非销毁该channel,而是发送close Token,对发送者,立即关闭,意味着无法
//继续对该通道发送数据,但对接收者,要等通道为空才关闭,类似于晚10点超市打烊,超市入口在晚
//10点就关闭了,顾客无法进入,但出口要等超市内所有的顾客走了以后才关闭。
channel.close()
}
//创建两个协程,每隔500ms打印从channel中获取到的内容。
for (i in 1..2) {
launch {
//使用isClosedForReceive查询是否对接收者关闭(试验阶段代码)
while (!channel.isClosedForReceive) {
println("job$i: " + channel.receive())
println(" 此时channel 是否对发送者开放? (${!channel.isClosedForSend})")
delay(500)
}
}
}
}
运行结果:
job1: 1
此时channel 是否对发送者开放? (true)
job2: 2
此时channel 是否对发送者开放? (true)
job1: 3
此时channel 是否对发送者开放? (true)
job2: 4
此时channel 是否对发送者开放? (true)
job1: 5
此时channel 是否对发送者开放? (true)
job2: 6
此时channel 是否对发送者开放? (true)
job1: 7
此时channel 是否对发送者开放? (true)
job2: 8
此时channel 是否对发送者开放? (true)
job1: 9
此时channel 是否对发送者开放? (false)
job2: 10
此时channel 是否对发送者开放? (false)
Process finished with exit code 0
channel的容量设置为2,每次只能存两个数据,并且是先进先出的。最后两个结果显示为false,说明channel在发送完第10个数之后,就立即对发送者关闭了,它不管这最后两个数据有没有人要,自己收工休息去了(第一个协程结束,channel.isClosedForSend为true),channel得到关闭超市指令,等job1和job2拿到channel内最后两个数据后,channel内空空如也,此时isClosedForReceive为true,channel才彻底关闭,程序结束,如果不加判断,job1和job2两个会傻傻的一直等新的数据。