当前位置: 首页 > 知识库问答 >
问题:

Kotlin中thread与coroutine的区别

翟聪
2023-03-14

在Kotlin中是否有任何特定的语言实现,它与其他语言实现的Coroutines有什么不同?

  • 什么意思是coroutine就像轻量线程?
  • 有什么区别?
  • kotlin余式实际上是并行/并发运行的吗?
  • 即使在多核系统中,在任何给定的时间也只有一个协调线在运行(对吗?)

在这里,我开始100000余次,这段代码后面发生了什么?

for(i in 0..100000){
   async(CommonPool){
    //run long running operations
  }
}

共有1个答案

陈朗
2023-03-14

由于我只在JVM上使用了coroutines,所以我将讨论JVM后端,还有Kotlin Native和Kotlin JavaScript,但这些Kotlin后端不在我的范围内。

所以,让我们从比较Kotlin协同式和其他语言协同式开始。基本上,您应该知道有两种类型的协同式:stackless和Stackful。Kotlin实现了无堆栈的coroutine--这意味着coroutine没有自己的堆栈,这就限制了coroutine的功能。你可以在这里读到一个很好的解释。

示例:

    null

什么叫柯鲁丁就像轻质线?

这意味着Kotlin中的coroutine没有自己的堆栈,它不在本机线程上映射,它不需要在处理器上进行上下文切换。

有什么区别呢?

线程抢占式多任务处理。(通常)。协同多任务处理。

线程-由OS管理(通常)。Coroutine-由用户管理。

Kotlin的coroutines实际上是并行/并发运行的吗?

这取决于,您可以在每个coroutine各自的线程中运行,也可以在一个线程或某个固定线程池中运行所有coroutine。

即使在多核系统中,在任何给定的时间也只有一个coroutine在运行(对吗?)

不,看前面的答案。

在这里,我开始100000余次,这段代码后面发生了什么?

其实要看情况。但假设您编写了以下代码:

fun main(args: Array<String>) {
    for (i in 0..100000) {
        async(CommonPool) {
            delay(1000)
        }
    }
}

此代码立即执行。

fun main(args: Array<String>) = runBlocking {
    for (i in 0..100000) {
        val job = async(CommonPool) {
            delay(1)
            println(i)
        }

        job.join()
    }
}

当您运行此程序时,kotlin将创建continuation的2*100000个实例,这将占用几十Mb的RAM,在控制台中,您将看到从1到100000的数字。

所以让我们以这样的方式重写这段代码:

fun main(args: Array<String>) = runBlocking {

    val job = async(CommonPool) {
        for (i in 0..100000) {
            delay(1)
            println(i)
        }
    }

    job.join()
}
 类似资料:
  • 为什么不是: 如有任何帮助,我们将不胜感激。

  • C#、Lua、 Python 语言都支持 coroutine 特性。coroutine 与 goroutine 在名字上类似,都可以将函数或者语句在独立的环境中运行,但是它们之间有两点不同: goroutine 可能发生并行执行; 但 coroutine 始终顺序执行。 goroutines 意味着并行(或者可以以并行的方式部署),coroutines 一般来说不是这样的,goroutines 通

  • 本文向大家介绍JAVA CountDownLatch与thread-join()的区别解析,包括了JAVA CountDownLatch与thread-join()的区别解析的使用技巧和注意事项,需要的朋友参考一下 今天学习CountDownLatch这个类,作用感觉和join很像,然后就百度了一下,看了他们之间的区别。所以在此记录一下。 首先来看一下join,在当前线程中,如果调用某个threa

  • Kotlin Coroutines - Use Cases on Android �� Learning Kotlin Coroutines for Android by example. �� Sample implementations for real-world Android use cases. �� Unit tests included! This repository is in

  • 问题内容: 我正在尝试学习科特林。是什么 ,并在科特林相比,Java的? 在Java中: 转换后显示: 问题答案: 和是可以用来声明变量(和属性)的两个关键字。区别在于,using 提供了一个只读变量,与Java中使用关键字相同。 Kotlin中的约定是在任何时候都可以使用,并且只有在知道要在某个地方更改其值时才应该使用a 。 请参阅有关定义局部变量和声明属性的官方文档。 是Java中不存在的可见