【问题标题】:In Kotlin, one thread can only run one coroutine at a time?在 Kotlin 中,一个线程一次只能运行一个协程?
【发布时间】:2020-10-05 00:22:55
【问题描述】:

我对 Kotlin 协程和线程的理解是这样的:

一个线程一次只能运行一个协程。一个线程可以处理多个协程。它可以暂停一个协程并运行一个不同的协程。但是在给定的时间点,只有一个协程会在一个线程上运行。您不能在同一时间点在同一线程上运行多个协程。

这样对吗?

【问题讨论】:

标签: multithreading kotlin kotlin-coroutines


【解决方案1】:

是的,这是正确的。

协程可以看作是一个指令序列,一个线程一直运行直到它遇到一个暂停点,此时协程暂停其执行(保存调用堆栈和局部变量以便稍后恢复)并产生控制权,并且在那个如果它不再在它运行的线程上运行。

这与返回的函数不再在线程上运行,将控制权返回给调用者非常相似,但是协程额外保存了它的状态,以便以后可以在同一个线程或另一个线程上恢复它。一旦协程产生控制权,线程就会返回到启动或恢复协程的代码。该代码可能是也可能不是另一个协程。

您可以将线程视为比协程更低级别(OS 级别或 JVM 级别)的原语。应用程序中的所有代码都在某个线程中执行,每个线程一次执行一个指令序列,协程在这个意义上并不排斥。

【讨论】:

  • 另一种思考方式是它就像一个事件循环。您有一个队列,其中添加了任务/协同例程,有 1 个线程(或更多,即 Dispatchers.IO)读取每个任务并运行它。查看协程 JVM 源代码,您会看到协程有一个队列,协程是一个 Runnable,它是一个常规方法,但被拆分为它的挂起点的每个部分。
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多