为什么当启动没有延迟(在Android中)时,它没有完成任务?



我在下面有一个简单的协同程序实验

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")
}

代码中的延迟阻止了相同消息的连续性,因为您有两个协同程序同时登录。

最新更新