这里的区别并不是关于调度程序,而是关于挂起函数不阻塞threads,并且协同路由是并发的。 delay()被称为"non-blocking的原因是它不会阻止从中调用的thread。这意味着thread可以在这段时间内自由地执行其他协程。另一方面,使用Thread.sleep()确实会阻止thread,因此它将阻止它在这段时间内执行任何其他协程和其他协程(或您的情况下的任务)将不得不等待。如果在协程方法中使用Thread.sleep(),应该会看到相同的结果,但这有点违背了协程的目的。 调度协同路由通常是按顺序进行的,但我认为这不能保证有文档记录的行为,这可能取决于调度器。然而,在任何情况下,当它们挂起时,它们被允许交错(通常)-这几乎就是并发的定义。 如果您不想要并发性,可以有几种选择: 在一个协程中完成所有工作on-the-spot:在单个launch内运行循环: lifecycleScope.launch { repeat(11) { i -> if (i % 2 == 0) { delay(2000) } else { delay(1000) } println(i) }} 在一个协程中完成所有工作,但在其他地方:使用Channel作为队列将事件发送到,而不是在每个项目上使用launch,只通过通道发送项目。然后,生成一个协程,轮询通道中的元素以进行处理。 如果您真正想