【2023】Kotlin教程

在这里插入图片描述

第三篇 Kotlin进阶

第19章 协程

协程与线程类似都可以处理并发任务。协程在很多语言中都支持,但Java没有协程支持,Kotlin支持协程编程。本章介绍协程。

19.3 创建IntelliJ IDEA Gradle项目
19.3.4 挂起函数

如果需要,开发人员也可以编写挂起函数,其实也很简单就在函数声明时候使用suspend关键字,示例如下:

suspend fun run(){
    ...
}

【注意】挂起函数只能在协程体中或其他的挂起函数中调用,不能在普通函数中调用,如下代码会发生编译错误。

fun main(){
    run()
}

挂起函数不仅可以是顶层函数,还可以是成员函数,还可以是抽象函数,子类重写挂起函数后还应该是挂起的。示例代码如下:

abstract class SuperClass{
    suspend abstract fun run()
}

class SubClass: SuperClass(){
    override suspend fun run(){}
}

上述代码SubClass类实现了抽象类SuperClass的抽象挂起函数run,重写后它还是挂起函数。

示例代码如下:

package com.dingjiaxiong

import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.lang.Math.random

/**
 * @Projectname: Hello
 * @Classname: `ch19.3.4`
 * @Author: Ding Jiaxiong
 * @Data:2023/4/4 15:32
 */

abstract class SuperClass {
    abstract suspend fun run()
}

class SubClass : SuperClass() {
    override suspend fun run() {}
}

suspend fun run(name: String) {
    // 启动一个协程
    for (i in 0..9) {
        // 打印协程执行次数
        println("子协程${name}执行第${i}次")
        // 随机生成挂起时间
        val sleepTime = (1000 * random()).toLong()
        // 协程挂起
        delay(sleepTime)
    }

    println("子协程${name}执行结束")
}

fun main() = runBlocking<Unit> {

    // 启动一个协程1
    val job1 = launch() {
        com.dingjiaxiong.run("job1")
    }

    // 启动一个协程2
    val job2 = launch {
        com.dingjiaxiong.run("job2")
    }

    delay(10000L) // 主协程挂起
    println("主协程结束。")
}

这个栗子中声明了一个挂起函数,创建并启动了两个协程,在它们的协程体中分别调用了run 函数。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐