博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java协程和线程_Kotlin中的线程和协程之间的区别
阅读量:6279 次
发布时间:2019-06-22

本文共 1140 字,大约阅读时间需要 3 分钟。

由于我仅在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的静态实例)上调度并执行。

转载地址:http://iznva.baihongyu.com/

你可能感兴趣的文章
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>