iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Kotlin协程的启动方式介绍
  • 530
分享到

Kotlin协程的启动方式介绍

2024-04-02 19:04:59 530人浏览 薄情痞子
摘要

目录1.GlobalScope.launch2.runBlocking 启动协程3.async启动协程启动协程的基本方式 1.GlobalScope.launch 代码示例: fun

启动协程的基本方式

1.GlobalScope.launch

代码示例:

fun testGlobalScope() {
    GlobalScope.launch {
        println("Coroutinue started!")
        delay(1000L)
        println("Hello World!")
    }
    println("After launch!")
    Thread.sleep(2000L)
    println("Process end!")
}
@DelicateCoroutinesapi
public object GlobalScope : CoroutineScope {
    
    override val coroutineContext: CoroutineContext
        get() = EmptyCoroutineContext
}
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyStandaloneCoroutine(newContext, block) else
        StandaloneCoroutine(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine
}

launch函数是CoroutineScope的扩展函数,它有三个参数:

  • context: CoroutineContext = EmptyCoroutineContext, 第一个参数是协程上下文,它的默认值是 EmptyCoroutineContext,如果不传这个参数,默认就会使用 EmptyCoroutineContext。也可以传入 Kotlin 官方为我们提供的 Dispatchers,来指定协程运行的线程池。(Dispatchers.io、Dispatchers.Unconfined、Dispatchers.Main)
  • start: CoroutineStart = CoroutineStart.DEFAULT,第二个参数是协程的启动模式,默认值是CoroutineStart.DEFAULT,CoroutineStart 是一个枚举类,一共有:DEFAULT、LAZY、ATOMIC、UNDISPATCHED。
  • block: suspend CoroutineScope.() -> Unit,第三个参数是函数类型block,它的类型是suspend CoroutineScope.() -> Unit。本质是一个挂起函数。
  • 函数的返回值是一个 Job,它其实代表的是协程的句柄,并不能返回协程的执行结果。

2.runBlocking 启动协程

代码示例

fun testRunBlocking2() {
    runBlocking {
        println("Coroutinue started!")
        delay(1000L)
        println("Hello World!")
    }
    println("After Launch")
    Thread.sleep(2000L)
    println("Process end")
}
@Throws(InterruptedException::class)
public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    val currentThread = Thread.currentThread()
    val contextInterceptor = context[ContinuationInterceptor]
    val eventLoop: EventLoop?
    val newContext: CoroutineContext
    if (contextInterceptor == null) {
        // create or use private event loop if no dispatcher is specified
        eventLoop = ThreadLocalEventLoop.eventLoop
        newContext = GlobalScope.newCoroutineContext(context + eventLoop)
    } else {
        // See if context's interceptor is an event loop that we shall use (to support TestContext)
        // or take an existing thread-local event loop if present to avoid blocking it (but don't create one)
        eventLoop = (contextInterceptor as? EventLoop)?.takeIf { it.shouldBeProcessedFromContext() }
            ?: ThreadLocalEventLoop.currentOrNull()
        newContext = GlobalScope.newCoroutineContext(context)
    }
    val coroutine = BlockinGCoroutine<T>(newContext, currentThread, eventLoop)
    coroutine.start(CoroutineStart.DEFAULT, coroutine, block)
    return coroutine.joinBlocking()
}

runBlocking是普通函数,第一个参数:context: CoroutineContext,协程上下文。第二个参数是函数类型,block: suspend CoroutineScope.() -> T,函数类型是有返回值类型 T 的,与 runBlocking 的返回值类型是一样的,runBlocking 其实是可以从协程当中返回执行结果的。

fun testRunBlocking() {
    val runBlockingResult = runBlocking {
        delay(500L)
        return@runBlocking "HaHa"
    }
    println("result:$runBlockingResult")
}
result:HaHa

runBlocking特点:

runBlocking 启动的协程会阻塞当前线程的执行。

3.async启动协程

使用 async{} 创建协程,可以通过它返回的Deferred拿到协程的执行结果。

代码示例

fun testAsync() {
    runBlocking {
        val deferred = async {
            println("do async:${Thread.currentThread().name}")
            delay(1000L)
            return@async "do completed"
        }
        println("After async:${Thread.currentThread().name}")
        val result = deferred.await()
        println("Result is: $result")
    }
}
After async:main @coroutine#1
do async:main @coroutine#2
Result is: do completed
public fun <T> CoroutineScope.async(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> T
): Deferred<T> {
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyDeferredCoroutine(newContext, block) else
        DeferredCoroutine<T>(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine
}

async注意点

  • async 启动协程以后,不会阻塞当前程序的执行流程。
  • async{}的返回值,是一个 Deferred 对象,它的 await() 方法,就可以拿到协程的执行结果。
  • await只是等待执行完,并不是触发执行。

到此这篇关于Kotlin协程的启动方式介绍的文章就介绍到这了,更多相关Kotlin协程启动内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Kotlin协程的启动方式介绍

本文链接: https://www.lsjlt.com/news/167063.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Kotlin协程的启动方式介绍
    目录1.GlobalScope.launch2.runBlocking 启动协程3.async启动协程启动协程的基本方式 1.GlobalScope.launch 代码示例: fun...
    99+
    2022-11-13
  • Kotlin启动协程的三种方式示例详解
    目录1.launch启动协程2.runBlocking启动协程3.async启动协程1.launch启动协程 fun main() = runBlocking { laun...
    99+
    2022-12-08
    Kotlin启动协程 Kotlin 协程
  • Linux的启动流程介绍
    这篇文章主要讲解了“Linux的启动流程介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux的启动流程介绍”吧!第一步、加载内核操作系统接管硬件以后,首先读入 /boot 目录下的内...
    99+
    2023-06-06
  • Android显式启动与隐式启动Activity的区别介绍
    前段时间立志坚持写博客,但是发现自己的积累的确不多,于是假期泡了泡图书馆,读了一些很有价值的文章。收获颇多,今天的文章分享为主,共同学习。 为什么要写显式启动与隐式启动Acti...
    99+
    2022-06-06
    启动 activity Android
  • win7怎么关闭开机自启动程序方式介绍
    win7怎么关闭开机自启动程序呢,客户使用win7的使用有的时候发现自己的电脑启动很慢,然后发现原来是开机后启动了许多程序,并且大部分都是不需要用的程序,因此想要关掉,但是不知道怎么操作,下面就是win7怎么关闭开机自启动程序方式介绍,大家...
    99+
    2023-07-18
  • spring启动加载程序的几种方法介绍
    关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作import javax.anno...
    99+
    2023-05-31
    spring 加载
  • Linux开机自启动服务两种方式介绍
    目录rc.local方式chkconfig方式rc.local方式 1首先创建一个要自启动的脚本 vi /etc/scripts/createFile.sh #!/bin/bash #开机创建一个文件夹 mkd...
    99+
    2022-06-04
    Linux服务开机自启动方式 Linux开机自启服务
  • MySQL读取配置文件的顺序、启动方式以及启动原理介绍
    本篇内容主要讲解“MySQL读取配置文件的顺序、启动方式以及启动原理介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL读取配置文件的顺序、启动方式以及...
    99+
    2022-10-18
  • Windows7的上帝模式的介绍与开启使用方法介绍(图文)
    GodMode的字面释义是:上帝模式。能够以此冠名,想来定有其非常之处。   简单来说,上帝模式可以理解为一个快捷方式;能籍其实现对系统设定的集中控制,让操作变得更简洁;只需鼠标轻轻一点,几乎所有设置,都可在一个窗口中找...
    99+
    2023-05-26
    win7上帝模式 介绍 开启 模式 使用 方法
  • Kotlin协程开发之Flow的融合与Channel容量及溢出策略介绍
    目录一.协程间的通信1.通道容量2.溢出策略二.FusibleFlow接口三.ChannelFlow类一.协程间的通信 当需要进行协程间的通信时,可以调用Channel方法,创建一个...
    99+
    2022-11-13
  • 简单介绍Android中Activity的四种启动模式
    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activit...
    99+
    2022-06-06
    启动 activity Android
  • Unity中协程IEnumerator的使用方法介绍详解
    在Unity中,一般的方法都是顺序执行的,一般的方法也都是在一帧中执行完毕的,当我们所写的方法需要耗费一定时间时,便会出现帧率下降,画面卡顿的现象。当我们调用一个方法想要让一个物体缓...
    99+
    2022-11-13
  • 硬盘启动bios设置方法的详细介绍
    电脑在启动的时候,会从硬盘中寻找引导文件从而启动系统,如果果硬盘不是第一启动项,或者有两个硬盘的话就会导致系统无法启动,那么就需要进入bios设置硬盘启动顺序,该如何操作呢,下面我们来看看硬盘启动bios设置方法教程。1、首先,开机,开机画...
    99+
    2023-07-10
  • linux中grub启动引导程序的加密介绍
    目录1、什么是grub加密2、grub加密步骤3、grub加密的lock属性1、什么是grub加密 上篇文章说了,系统在开机的时候,有一个5秒的读秒时间,方便你进入到grub界面中。 如下图所示: 此时我们按下Ente...
    99+
    2022-06-04
    Linux对grub引导加密 grub启动引导程序的加密
  • 详细介绍在Uniapp中设置启动页的方法
    随着移动互联网的普及,越来越多的应用程序涌入市场。其中,有很多应用程序都有一个重要的功能,就是启动页。作为一款跨平台的应用程序开发框架,Uniapp也提供了设置启动页的功能。本篇文章将为您详细介绍如何在Uniapp中设置启动页。一、为什么需...
    99+
    2023-05-14
  • win10如何取消手机软件启动win10撤销手机软件启动方式 详细介绍
    有一些手机软件在用户启动的过程中便会跟随启动,假如那样的手机软件过多得话会拖慢你的开机速度,那麼win10如何取消手机软件启动启动呢?你先开启资源管理器,转换到启动菜单栏,那样就能看见这些启动启动的手机软件,鼠标右键选定要想撤销自启动的手机...
    99+
    2023-07-14
  • 介绍3种ssh远程连接的方式
    摘要:SSH(安全外壳协议 Secure Shell Protocol,简称SSH)是一种加密的网络传输协议,用于在网络中实现客户端和服务端的连接,典型的如我们在本地电脑通过 SSH连接远程服务器。 本文分享自华为云社区《ssh 远程...
    99+
    2023-09-01
    ssh 服务器 网络协议 网络安全 加密
  • 10种CSS3实现的loading动画的方式介绍
    本篇内容主要讲解“10种CSS3实现的loading动画的方式介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“10种CSS3实现的loading动画的方式介绍”吧!效果html<body...
    99+
    2023-06-08
  • JAVA多线程实现的三种方式介绍
    本篇内容主要讲解“JAVA多线程实现的三种方式介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JAVA多线程实现的三种方式介绍”吧!JAVA多线程实现方式主要有三种:继承Thread类、实现R...
    99+
    2023-06-02
  • win2003紧急修复磁盘的启动和使用的方法介绍
    常说win2003是个安全性与稳定性并行的系统,但是也不能称得上十全十美,在操作中总会遇到那么些问题,这时候你只要迅速启动紧急修复磁盘,很多问题在这个功能下都能被快速的解决。 win2003紧急修复磁盘的启动和使用的方法...
    99+
    2023-05-19
    win2003 磁盘修复
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作