我在下面有一个简单的协同程序实验
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking {
launch {
repeat(5) {
Log.d("Track", "First, current thread: ${Thread.currentThread()}'")
delay(1)
}
}
launch {
repeat(5) {
Log.d("Track", "Second, current thread: ${Thread.currentThread()}'")
delay(1)
}
}
}
}
这将打印全部5次,或者同时打印两个launch
。
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
但是,如果我从两个launch
的代码中删除delay(1)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
runBlocking {
launch {
repeat(5) {
Log.d("Track", "First, current thread: ${Thread.currentThread()}'")
// delay(1)
}
}
launch {
repeat(5) {
Log.d("Track", "Second, current thread: ${Thread.currentThread()}'")
// delay(1)
}
}
}
}
对于两个launch
,它只按顺序打印2次。
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: First, current thread: Thread[main @coroutine#2,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
Track: Second, current thread: Thread[main @coroutine#3,5,main]'
为什么它没有完成所有的5次循环?
注意事项在单元测试中运行时效果良好(非Android环境,即所有5次打印(
Android的记录器在看到两条以上连续的、相同的消息后,会省略重复的日志消息,并声明包为";健谈";。
在没有协同程序的情况下尝试这个,你会看到:
repeat(10) {
Log.d("all the same", "Hello World")
}
repeat(10) {
Log.d("with indices", "Hello World $it")
}
代码中的延迟阻止了相同消息的连续性,因为您有两个协同程序同时登录。