kotlin协程是否会阻止IO上的线程,直到它完成?

kotlin协程是否会阻止IO上的线程,直到它完成?,kotlin,kotlinx.coroutines,Kotlin,Kotlinx.coroutines,据我所知,执行阻塞IO的协同程序将阻塞它正在运行的线程。该线程将被操作系统挂起,以便稍后重新调度 这是否意味着如果我有一个线程池,其中有50个线程和50个并发协程在每个线程上执行IO,那么它们将有效地阻止线程池中的所有线程,直到其中至少一个线程完成IO操作 或者是否有一种机制来停放导致阻塞某种队列上IO的协程 如果我有一个线程池,其中有50个线程和50个并发协程在每个线程上执行IO,那么它们将有效地阻止线程池中的所有线程,直到其中至少一个线程完成IO操作为止 对。没有办法避免阻塞方法阻塞调用线程

据我所知,执行阻塞IO的协同程序将阻塞它正在运行的线程。该线程将被操作系统挂起,以便稍后重新调度

这是否意味着如果我有一个线程池,其中有50个线程和50个并发协程在每个线程上执行IO,那么它们将有效地阻止线程池中的所有线程,直到其中至少一个线程完成IO操作

或者是否有一种机制来停放导致阻塞某种队列上IO的协程

如果我有一个线程池,其中有50个线程和50个并发协程在每个线程上执行IO,那么它们将有效地阻止线程池中的所有线程,直到其中至少一个线程完成IO操作为止

对。没有办法避免阻塞方法阻塞调用线程这一事实。协同程序并不是改变这一点的魔杖

协同程序的价值在于,您可以使用非常自然的编程模型将阻塞操作从UI线程卸载到线程池。代码看起来就像一个正常的函数调用,它以一个返回值完成,但实际上协程挂起,以便其他UI事件处理程序可以运行

然而,当使用基于回调的非阻塞、异步API时,协同路由确实会大放异彩。在这种情况下,您可以在UI线程上获得可以描述为“单线程并发”的行为。并发通过交叉执行事件处理程序来工作。与本机线程的关键区别在于,交织不依赖于在线程不知情的情况下先发制人地挂起线程。相反,协同程序本身必须要求暂停