初遇Kotlin协程

《Kotlin 程序设计》第十二章 Kotlin的多线程:协程(Coroutines) 第十二章 Kotlin的多线程:协程(Coroutines) 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https://detail.tmall.c... 阅读详情

初遇Kotlin协程(coroutine)

这篇文章我们将建立协程项目,并用Coroutines编写相关代码。

Kotlin 1.1引入了协程程序,这是一种编写异步、非阻塞代码(以及其他)的新方法。在这篇文章中,我们将使用kotlinx.coroutines库来了解基本的协程写法,这个库是对已存的JAVA库的封装。

Setting up a project

我们将使用Gradle来构建项目。
加入库依赖:

dependencies {
    ...
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.1"
}

这个库托管在JCenter仓库中,我们加入仓库地址:

repositories {
    jcenter()
}	
Coroutine第一行代码

我们可以认为协程是一种轻量级的线程。像线程一样,协程可以并行,可以相互间通信。和线程最大的不同是,协程是非常轻量级的,我们可以创建几千个协程,但是消耗的性能却非常非常的少。而对于真的线程,这是非常耗资源的。几千个线程对于现代计算机来说是一个严重的挑战。
我们怎么启动一个协程呢?可以使用 launch{}函数:

launch{
...
}  

完整的例子如下:

println("Start")
GlobalScope.launch {
    delay(1000)
    println("Hello")
}
Thread.sleep(2000) // wait for 2 seconds
println("Stop")

这里我们启动了一个协程,等待一秒后,打印了 Hello。
我们使用了 delay() 这个方法,这个方法类似 Thread.sleep() ,但是更好,它不阻塞线程,只是挂起协程本身。当协程挂起等待是,返回到线程;当协程等待完成时,协程恢复继续运行。

在这个例子中,主线程 main() 必须等待协程完成,否则在输出 Hello 之前,程序就结束了。

假如我们在 main() 中直接使用 delay() 函数,将会遇到编译错误:

Suspend functions are only allowed to be called from a coroutine or another suspend function

这是因为挂起函数只能运行在协程中,我们可以使用 runBlocking() 来启动一个协程。

runBlocking {
    delay(2000)
}

#####复杂一点的例子
让我们来看下协程是不是轻量级的,我们启动一百万个线程:

val c = AtomicLong()

for (i in 1..1_000_000L)
    thread(start = true) {
        c.addAndGet(i)
    }

println(c.get())

这个例子将会运行较长一段时间,消耗较多的资源。?
我们换种方式,用协程来实现:

val c = AtomicLong()

for (i in 1..1_000_000L)
    GlobalScope.launch {
        c.addAndGet(i)
    }

println(c.get())

这个例子几秒就完成了,对比线程,有着显著的优势。

Async: 从协程中返回值

另一种启动协程的方法是使用 async{} ,它类似 launch{},但是它返回 Deferred<T> 实例,这个实例有 await() 方法,该方法返回协程结果。

我们启动一百万个协程,然后持有它们的返回结果 Deferred。

val deferred = (1..1_000_000).map { n ->
    GlobalScope.async {
        n
    }
}

这些协程都已经启动,我们把它们加起来。

val sum = deferred.sumBy { it.await() }

我们使用了标准函数库 sumBy,来把他们加在一起,但是我们简单这样做,编译器会报错:

Suspend functions are only allowed to be called from a coroutine or another suspend function

因为 await() 是挂起函数,不能用在协程外面,正如上面说过的一样。我们把它放在协程里:

runBlocking {
    val sum = deferred.sumBy { it.await() }
    println("Sum: $sum")
}

现在它将会顺利输出结果。我们稍微改下代码,确认这个百万个协程是平行的,假如我们再每个启动的协程里延时一秒,看看是否要花费百万秒才会输出结果:

val deferred = (1..1_000_000).map { n ->
    GlobalScope.async {
        delay(1000)
        n
    }
}

我们可以运行下,就可以知道结果。结果是只用了十几秒。显然,它是并行的。

Suspending functions

现在我们把里边的代码提取出来:

fun workload(n: Int): Int {
    delay(1000)
    return n
}

一个类似的错误将会出现:

	Suspend functions are only allowed to be called from a coroutine or another suspend function

让我们进一步看看这个是什么意思。协程最大的优势是可以不阻塞线程的挂起。编译器将会组织特殊的代码来达到这个可能,所以我们使用 suspend 来修饰一个方法:

suspend fun workload(n: Int): Int {
    delay(1000)
    return n
}

现在我们可以在协程种调用 workload 方法,编译器知道这个方法可能会挂起,并做相应的工作。

GlobalScope.async {
    workload(n)
}

我们的 workload 方法能够在协程中被调用,或者别的挂起函数,但是不能够在协程外调用。相应的,delay() 和 await() 函数被 suspend 修饰,这就是为什么它们只能在挂起函数中被调用,或者在协程内被调用,runBlocking(), launch{}, 或者 async()。

条码打印工具-Bartender的使用 文章目录1、安装Bartender1.解压安装包,可获得bartender2021版本和破解文本2. 双击“BarTender_2021_R1_Full_x64.exe”文件运行,勾选协议及软件安装设置3. 选择安装选项,自行选择勾选,点击Browser可更换软件安装路径4. 耐心等待软件安装完成,直接点击完成退出5. 此时会弹出提示需要激活许可证,先点击取消6. 接着将Crack夹中的“BarTend.exe”破解文件复制到软件安装目录中替换7. 再双击“serial.reg”导入注册,点击确定即可8. 阅读详情

相关推荐

解密HDMI热插拔检测电路:从HPD引脚到EDID读取的全流程避坑

本文深入解析HDMI热插拔检测与EDID读取的全流程,从HPD引脚信号特性、DDC通道I2C协议到EDID数据结构,系统剖析了硬件电路设计、信号完整性和软件协议中的常见陷阱与解决方案,为消费电子设备开发者提供了一套完整的实战避坑指南。

weixin_29291069的博客 646

Kotlin | 深入理解协程

可以在不引入回调的情况下控制任何代码行的线程池,因此可以将其应用于非常小的函数,例如从数据库中读取数据或执行网络请求。来确保每个函数都是主线程安全的,这意味着,您可以从主线程调用每个函数。注:上面的协程启动方式并不推荐在项目中直接使用,因为生命周期比较长,如果没有主动关闭可能就会产生内存泄漏。,但是最终子协程中的异常还是在顶层的父协程种处理的,如果就想在子协程中处理异常呢?可见异常最终是在子协程中处理的,且虽然子协程中发生了异常,父协程依然能执行完毕。之后的延续,其中类型T代表的是原来函数的返回值类型。

小马快跑的博客 3604

贝叶斯地理统计模型R-INLA-1

贝叶斯地理统计模型R-INLA-1

学习中 2426

全民 Kotlin:协程特别篇

目录 什么是协程suspend 关键字介绍集成协程runBlocking 用法launch 用法async 用法协程的线程调度器协程的启动模式协程设置执行超时协程的生命周期控制什么是协程 ...

Android技术之家 2731

【AUTOSAR-E2E】-1.4-详述E2E Transformer解决方案

共13页精讲 目录 1“Data Transformation”介绍 1.1 基于SOME/IP Transformer 1.2 基于COM Based Transformer 2 ComXf(COM Based Transformer)介绍 2.1 ComXf(COM Based Transformer)功能规范 2.2 ComXf(COM Based Transformer)提供的服务 2.3 配置注意事项 3 E2EXf(E2E Transformer)介绍 3.1 E2EX...

「汽车电子助手」的博客 4700

Rcpp简介

在数据分析时,代码的运行速率常常是我们所关心的话题之一。小Q往期的文章中也有介绍通过并行计算提升R运行速率的文章。然而R代码自身的运行速率偏慢,具有某种“先天缺陷”。因此,并行R函数的运行时间有时仍然不尽人意。本期小Q与大家分享R的另一提速方式:Rcpp之效率瓶颈突破。 1 什么是Rcpp 在往期的文章中曾讲过,我们在R中尽量采用向量化或内建函数运算,避免自编循环带来的额外时间消耗。然而,算法中有时难以避免循环,若循环部分耗时严重,直接并行含有该循环的算法显得力不从心,此时又该如何?稍有编程知识的读者可

Mrrunsen的博客 2260

Kotlin协程学习之路(二):挂起函数

Kotlin协程学习之路(二):挂起函数

RQ997832的专栏 2345

网红商品数据抓取:基于Python的高效爬虫实战

本篇博客介绍了从爬取到存储、分析和可视化网红商品数据的完整流程。通过Python的强大生态,我们能够轻松完成复杂的数据抓取任务。在实际应用中,还可以将此爬虫与机器学习模型结合,进一步挖掘数据价值。

2201_76125261的博客 1476

Kotlin 协程总结

文章目录一、协程是什么1.简介2.协程好在哪3.协程具体怎么用a.添加依赖b.开始使用c.suspend4.小结二、挂起是什么1.「挂起」的本质线程:协程:2.怎么就「挂起」了?3.suspend 的意义?4.怎么自定义 suspend 函数?a.什么时候需要自定义 suspend 函数a.具体该怎么写5.小结三、挂起的非阻塞式是怎么回事1.什么是「非阻塞式挂起」2.为什么要讲非阻塞式挂起3.协程...

yechaoa 2037

SAP SLT 在 carve-out 场景中的关键作用:从理论到实操全景展现

深入剖析 SAP Landscape Transformation(SLT Replication Server)在 carve‑out 场景中的价值,需要从 carve‑out 本身的背景逻辑说起。carve‑out 指的是企业因并购、拆分、剥离商业单元等因素,而将 SAP 系统中某部分业务(例如组织单元、公司代码、模块数据等) separated 出来,导入到独立的系统中。这一过程极具挑战性,既要确保业务连续性,又要实现数据精准迁移和系统隔离 (

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 7553

车载以太网-组播

车载以太网-组播

天赐好车的博客 252

Kotlin 协程 - 挂起函数 Suspend Function

什么时候定义需要做耗时操作的时候(I/O、计算、等待)才会挂起当前的协程。解决了什么创建者告知这是一个耗时操作,并指定了该协程在后台线程执行,保障了调用者的线程安全。suspend关键字用来限制该函数只能在协程里调用或者在其他挂起函数里调用,因为“挂起->执行完->切回去”只有在协程中使用才能实现。真正挂起操作靠的是最终调用的那个协程自带的挂起函数。也有提醒“这是一个耗时操作,是挂起函数要在协程中使用”的意思。

HugMua的博客 6960

使用 Visual Studio Code 搭建 SAP UI5 本地开发环境

工欲善其事,必先利其器。时至今日,SAP 提供了非常多的 SAP UI5 开发工具,既包含本地搭建的,也包含浏览器里远端使用的工具,比如 WebIDE 和 Business Application Studio. 我们访问下面这个链接,就能找到所有这些工具的安装或者配置步骤: https://tools.hana.ondemand.com/#sapui5 如果想选择本地开发,SAP 推荐的工具是 Visual Studio Code,也就是本文要介绍的内容。 也可以下载 WebIDE 的本地安装包,将其安

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1万+

从 Kotlin 到 KSP 再到项目实践 KtorfitX:一段探索之路

本文讲述了作者从初识Kotlin到深入探索KSP技术的历程。2021年接触Kotlin后,作者逐渐从使用语法糖转向研究其生态扩展能力,特别是KSP技术。基于KSP,作者开发了ktorfitx项目,解决了Kotlin Multiplatform中网络请求重复编码的问题。这段经历让作者深刻体会到技术真正的价值在于解放开发者创造力,而非单纯追求语法优雅。文章展现了Kotlin从语言到开发平台的演进,以及如何通过技术创新解决实际问题。

a2965502228的博客 507

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

初遇Spring Boot教程

Spring Boot介绍 1.Spring Boot的角色 Spring Framework:JaveEE的框架 Spring Boot:快速构建的Spring应用 Spring Cloud:构建Spring Boot的分布式的环境 2.Spring Boot 2.0 编程语言:Java 8+ 、Kotlin(函数式编程语言) 底层框架:Spring Framwork 5.0.x 全新特性...

haoyuexihuai的专栏 347

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深入理解Kotlin的lateinit:从UninitializedPropertyAccessException异常看属性初始化最佳实践

本文深入解析Kotlin中lateinit修饰符的设计哲学与使用风险,重点探讨如何避免UninitializedPropertyAccessException异常。通过对比其他初始化方式,结合依赖注入、多线程等实际场景,提供属性初始化的最佳实践与决策流程,帮助开发者构建更健壮的Kotlin应用程序。

happy2的博客 643

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

No signature of method编译出错的问题

首先问题如下: A problem occurred evaluating project ':app'. No signature of method: build_5woso1t2zz3j65kzgsuf20yp6.android() is applicable for argument types: (build_5woso1t2zz3j65kzgsuf20yp6$_run_closure1) values: [build_5woso1t2zz3j65kzgsuf20yp6$_run_closure1

gwy2018的博客 1万+

SpringBoot入门3(SpringBoot 2.0)

参考:Spring Boot 2.0深度实践-初遇Spring Boot 环境: JDK8 Maven IDEA POSTMAN   1、Spring Boot 介绍 2、Spring Boot 2.0 新特性 3、Spring Web MVC 学习案例 4、Spring Web Flux学习案例 5、多模块化项目 6、各种Spring Boot构建方式 7、各种 Spr...

qq_34515002的博客 226

kotlin函数

infix标记法 在以下情况下,也可以使用中缀符号调用函数: 它们是成员函数或扩展函数-它们只有一个参数 它们用infix关键字标记 // Define extension to Int infix fun Int.shl(x: Int): Int { ... } // call extension function using infix notation 1 shl 2 // is the...

gengqiquan的博客 1290

kotlin 携程

挂起函数可以在不阻塞线程的情况下挂起执行,并在稍后恢复。协程运行在特定的上下文中,调度器 (Dispatcher) 决定了协程运行的线程或线程池。决定了协程在哪个线程池上执行。是一个协程的句柄,它表示协程的生命周期,并允许显式地取消协程。要使用挂起函数,需要在协程上下文中启动它。它们只能在协程或另一个挂起函数内调用。可以组合多个挂起函数,实现复杂的异步操作。启动一个新的协程,不返回任何结果。,它的子协程失败不会取消父协程。上执行代码块,并返回结果。协程中的异常处理可以使用。协程中的异常处理可以使用。

heeheeai的博客 1127

Kotlin 协程探索

Kotlin 协程是一套线程 API 框架,在 Kotlin 语言环境下使用它做并发编程比传统 Thread, Executors 和 RxJava 更有优势,代码逻辑上“同步非阻塞“,而且简洁,易阅读和维护。suspend是 Kotlin 语言中一个关键字,用于修饰方法,当修饰方法时,该方法只能被suspend修饰的方法和协程调用。此时,也预示着该方法是一个耗时方法,告诉调用者需要在协程中使用。Android 上的 Kotlin 协程下一篇,将研究 Kotlin Flow。

wangjiang 1271

Kotlin 协程一 —— 协程 Coroutine

Go、Python 等很多变成语言在语言层面上都实现协程,java 也有三方库实现协程,只是不常用, Kotlin 在语言层面上实现协程,对比 java, 主要还是用来解决异步任务线程切换的痛点。 协程基于线程,但相对于线程轻量很多,可理解为在用户层模拟线程操作; 每创建一个协程,都有一个内核态线程动态绑定,用户态下实现调度、切换,真正执行任务的还是内核线程。 线程的上下文切换都需要内核参与,而协程的上下文切换,完全由用户去控制,避免了大量的中断参与,减少了线程上下文切换与调度消耗的资源。

金戈鐡馬 5485

Kotlin 协程总结,android工程师要求

} 方法一通常适用于单元测试的场景,而业务开发中不会用到这种方法,因为它是线程阻塞的。 方法二和使用 runBlocking 的区别在于不会阻塞线程。但在 Android 开发中同样不推荐这种用法,因为它的生命周期会和 app 一致,且不能取消(什么是协程的取消后面会讲)。 方法三是比较推荐的使用方法,我们可以通过 context 参数去管理和控制协程的生命周期(这里的 context 和 Android 里的不是一个东西,是一个更通用的概念,会有一个 Android 平台的封装来配合使用)。

m0_66264655的博客 1606

Kotlin Coroutines不复杂, 我来帮你理一理

Coroutines 协程时光小说网 wap.youxs.org 最近在总结Kotlin的一些东西, 发现协程这块确实不容易说清楚. 之前的那篇就写得不好, 所以决定重写. 反复研究了官网文档和各种教程博客, 本篇内容是最基础也最主要的内容, 力求小白也能看懂并理解. Coroutines概念 Coroutines(协程), 计算机程序组件, 通过允许任务挂起和恢复执行, 来支持非抢占式...

爱无止 734

Kotlin Coroutines(协程)

Kotlin Coroutines(协程) 原文链接:https://blog.dreamtobe.cn/kotlin-coroutines/ 发表2017-08-20 在前面的文章,我们提到了kotlin的基本语法、为什么选用kotlin、根据《Effective Java》Kotlin语法层面的优化、kotlin单元测试编写以及kotlin对包大小影响、kotlin与Java对...

Android小码家 6347

在Kotlin 中如何轻松愉快的处理异步操作

起步kotlin通过协程来实现异步操作,关于协程的一些基本概念可以参考这里Kotlin中线程的代替者——协程,究竟有什么好?.kotlin在它的标准库中仅仅提供了最小化的底层API的支持。像 async和await 既不是Kotlin的关键字,又没有被包括在标准库中。对于一般的开发者,或是刚入门的的人来说仅仅通过标准库提供的那些东西,要想使用其协程来是十分困难的。幸运的是,我们不要从头写起,Kotl

feint123的博客 1万+
上一篇: 异步编程技术
下一篇: Coroutine 基础
xiongmaozhijin
博客等级 码龄15年 4粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值