由于我仅在JVM上使用协程,因此我将讨论JVM后端,也有Kotlin本机和Kotlin JavaScript,但是这些Kotlin后端不在我的讨论范围之内。

因此,让我们开始将Kotlin协程与其他语言的协程进行比较。 基本上,您应该知道协程有两种类型:无堆栈和堆栈。 Kotlin实现了无堆栈的协程-这意味着协程没有自己的堆栈,这限制了协程的功能。 您可以在此处阅读良好的解释。

例子:

无堆栈:C#,Scala,Kotlin

大量:Quasar,Javaflow

协程就像轻量级线程一样意味着什么?

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

有什么区别?

线程-抢先多任务。 (通常)。协程-协作多任务。

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

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

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

有关协程如何在此处执行的更多信息。

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

不,请参阅上一个答案。

在这里,我要启动100000个协程,这段代码后面会发生什么?

实际上,这取决于。 但是,假设您编写以下代码:

fun main(args: Array) {

for (i in 0..100000) {

async(CommonPool) {

delay(1000)

}

}

}

此代码立即执行。

因为我们需要等待Continuation调用的结果。

所以让我们解决这个问题:

fun main(args: Array) = runBlocking {

for (i in 0..100000) {

val job = async(CommonPool) {

delay(1)

println(i)

}

job.join()

}

}

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

因此,让我们以这种方式重写此代码:

fun main(args: Array) = runBlocking {

val job = async(CommonPool) {

for (i in 0..100000) {

delay(1)

println(i)

}

}

job.join()

}

我们现在实现了什么? 现在,我们仅创建2700117825680458752的100001实例,这要好得多。

每个创建的Continuation将在CommonPool(ForkJoinPool的静态实例)上调度并执行。

java协程和线程_Kotlin中的线程和协程之间的区别相关推荐

  1. kotlin 子线程睡3秒_Kotlin中线程和协程之间的区别

    Ruslan.. 47 由于我只在JVM上使用协同程序,我将讨论JVM后端,还有Kotlin Native和Kotlin JavaScript,但Kotlin的这些后端超出了我的范围. 让我们首先将K ...

  2. python协程和线程_线程和协程之间的区别

    线程和协程之间的区别很大,甚至大过进程和线程之间的区别.线程建立在进程之上,协程建立在线程之上.那么协程是什么呢? 协程是一段计算机程序,它一般是一个协作类型的子程序,执行时允许暂停和恢复.协程非常适 ...

  3. python的进程线程和协程_python成长之路 :线程、进程和协程

    python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...

  4. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  5. java线程池newfi_Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...

  6. Java 确定线程池中工作线程数的大小

    以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...

  7. 进程、线程和协程之间的区别和联系

    文章目录 一.进程 二.线程 三.进程和线程的区别与联系 四.一个形象的例子解释进程和线程的区别 五.进程/线程之间的亲缘性 六.协程 一.进程   进程,直观点说,保存在硬盘上的程序运行以后,会在内 ...

  8. python协程详解_彻底搞懂python协程-第一篇(关键词1-4)

    任何复杂的概念或系统都不是凭空出现的,我们完全可以找到它的演化历程,寻根究底终会发现,其都是在一系列并不那么复杂的简单组件上发展演化而来! by 落花僧 本文通过一系列关键概念,逐步递进理解协程. 0 ...

  9. 协程的原理和应用,C++现实协程

    协程的原理 协程(coroutine)跟具有操作系统概念的线程不一样,实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样.只不过函数只有一个调用入口 ...

最新文章

  1. 大多数人都不知道,人类基因组正在衰败
  2. 2018年1月29日
  3. Nexus 私服 3rd party 库被误删怎么办
  4. Python中文件的介绍以及操作
  5. python爬虫更改ip_Python小说爬虫,有目录,有文字极简处理,还有IP解锁方式
  6. docker用gpu的参数_Docker化部署(GPU)
  7. greensock 框架
  8. 耳机煲机软件测试工资,耳机煲机有必要吗_耳机煲机正确方法
  9. 路由器和带宽猫、AP、AC、交换机
  10. 【算法:leetcode】双指针:142. 环形链表 II 633. 平方数之和
  11. 记录一次Spring提供的定时任务
  12. 深入Android应用开发_核心技术解析与最佳实践
  13. Canvas API详解
  14. 电机与运动控制笔记整理(三)——异步电机概述
  15. testflight无法联网怎么办_Testflight不可用怎么办?
  16. 剖析网页游戏前景 三大趋势或助其健康发展
  17. rosbag工具plotjuggler无法打开rosbag的问题
  18. 如何定位导致Crash的代码位置
  19. 原生混合云 — 经政企打磨方能赢得政企信任
  20. udec采场开挖教程_UDEC4.0使用说明

热门文章

  1. 艺术平面素材|梦幻粉色手机屏幕海报
  2. Web Scrap con Python:GuíaPaso a Paso
  3. 取各位数字c语言程序,取出数字的每一位
  4. 再来一道小菜:香辣丝瓜
  5. belr-error-Could not load grammar vcard_grammar because the file could not be located.
  6. 如何让拖延变成高效工作的工具
  7. 网易基于Filebeat的日志采集服务设计与实践
  8. 谈谈Spring中的对象跟Bean,你知道Spring怎么创建对象的吗?
  9. 【NS2】TCP相关计算
  10. FBX格式解析顶点信息和用OpenGL显示