Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Kotlin中,一个线程一次只能运行一个协程?_Multithreading_Kotlin_Kotlin Coroutines - Fatal编程技术网

Multithreading 在Kotlin中,一个线程一次只能运行一个协程?

Multithreading 在Kotlin中,一个线程一次只能运行一个协程?,multithreading,kotlin,kotlin-coroutines,Multithreading,Kotlin,Kotlin Coroutines,我对Kotlin协程和线程的理解如下: 一个线程一次只能运行一个协程。一个线程可以处理多个协程。它可以挂起一个协同程序并运行另一个协同程序。但是在给定的时间点上,一个线程上只运行一个协同程序。不能在同一时间点在同一线程上运行多个协程 这是对的吗?是的,这是对的 协程可以看作是一个指令序列,线程在遇到挂起点之前一直运行,在该挂起点处协程暂停执行(保存调用堆栈和本地变量以供以后恢复)并产生控制,在这种情况下,它不再在其运行的线程上运行 这非常类似于返回的函数不再在线程上运行,将控制权返回给调用者,但

我对Kotlin协程和线程的理解如下:

一个线程一次只能运行一个协程。一个线程可以处理多个协程。它可以挂起一个协同程序并运行另一个协同程序。但是在给定的时间点上,一个线程上只运行一个协同程序。不能在同一时间点在同一线程上运行多个协程

这是对的吗?

是的,这是对的

协程可以看作是一个指令序列,线程在遇到挂起点之前一直运行,在该挂起点处协程暂停执行(保存调用堆栈和本地变量以供以后恢复)并产生控制,在这种情况下,它不再在其运行的线程上运行

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


您可以将线程视为比协同路由更低级别(OS级别或JVM级别)的原语。应用程序中的所有代码都在某个线程中执行,每个线程一次执行一个指令序列,从这个意义上讲,协程并不是排斥。我建议观看这段视频,它解释了挂起函数是如何“在引擎盖下”工作的:另一种思考方式是,它类似于事件循环。您有一个任务/协同例程添加到的队列,有一个线程(或更多线程,即Dispatchers.IO)读取并运行每个任务。查看协程JVM源代码,您将看到有一个用于协例程的队列,而协例程是一个可运行的,它是一个常规方法,但被划分为其挂起点的每个部分。