• SpringBoot + kotlin 协程小记


    前言:

    Kotlin 协程是基于 Coroutine 实现的,其设计目的是简化异步编程。协程提供了一种方式,可以在一个线程上写起来像是在多个线程中执行。

    协程的基本概念:

    • 协程是轻量级的,不会创建新的线程。

    • 协程会挂起当前的协程,而不会阻塞线程。

    • 协程可以在suspend函数中暂停执行,并在暂停点恢复执行。

    一、引包

    ${kotlin.version} : 1.8.21

    注意:org.jetbrains.kotlinx 最新在1.6.0

    1. <dependency>
    2. <groupId>org.jetbrains.kotlin</groupId>
    3. <artifactId>kotlin-stdlib-jdk8</artifactId>
    4. <version>${kotlin.version}</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.jetbrains.kotlin</groupId>
    8. <artifactId>kotlin-reflect</artifactId>
    9. <version>${kotlin.version}</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.jetbrains.kotlinx</groupId>
    13. <artifactId>kotlinx-coroutines-core</artifactId>
    14. <version>1.6.0</version>
    15. </dependency>
    16. <dependency>
    17. <groupId>org.jetbrains.kotlin</groupId>
    18. <artifactId>kotlin-test</artifactId>
    19. <version>${kotlin.version}</version>
    20. <scope>test</scope>
    21. </dependency>

    二、 interface 定义

    1. import com.baomidou.mybatisplus.extension.service.IService
    2. import com.zc.bean.PriceBean
    3. import org.springframework.stereotype.Repository
    4. @Repository
    5. interface TestKotlinService : IService<PriceBean> {
    6. //suspend 协程方法的定义
    7. suspend fun test(): String
    8. fun te()
    9. }

    三、Ipml 实现

    1. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
    2. import com.zc.bean.PriceBean
    3. import com.zc.mapper.TestKotlinMapper
    4. import kotlinx.coroutines.Dispatchers
    5. import kotlinx.coroutines.delay
    6. import kotlinx.coroutines.withContext
    7. import lombok.extern.slf4j.Slf4j
    8. import org.springframework.stereotype.Service
    9. /**
    10. * @author zc
    11. * @date 2024/4/18 9:56
    12. * @desc
    13. */
    14. @Service
    15. @Slf4j
    16. open class TestKotlinServcieImpl : ServiceImpl<TestKotlinMapper, PriceBean>(), TestKotlinService{
    17. //withContext 切换到指定的线程(IO线程)
    18. override suspend fun test() = withContext(Dispatchers.IO){
    19. delay(10000)
    20. println("suspend")
    21. return@withContext "success"
    22. }
    23. override fun te(){
    24. println("test")
    25. }
    26. }

    四、controller 

    1. /**
    2. * @author zc
    3. * @date 2024/4/18 10:38
    4. * @desc
    5. */
    6. @RestController
    7. @RequestMapping("/price")
    8. @Tag(name = "kotlin")
    9. class TestKotlinController {
    10. @Autowired
    11. private lateinit var testKotlinService: TestKotlinService;
    12. @GetMapping("test")
    13. fun testScope(){
    14. println("start")
    15. testKotlinService.te()
    16. //创建协程,并在io线程上执行
    17. val coroutineScope = CoroutineScope(Dispatchers.IO)
    18. coroutineScope.launch {
    19. //async/await获取返回值
    20. // val result = async { testKotlinService.test() }.await()
    21. val result =
    22. withContext(Dispatchers.IO) { testKotlinService.test() }
    23. println("result: $result")
    24. }
    25. println("end")
    26. }
    27. }

    五、测试

    调用swagger 接口测试,在等待10秒后打印出suspend result: success,异步调用成功

    六、学习文档:

    文档 · Kotlin 官方文档 中文版

  • 相关阅读:
    Linux高负载排查最佳实践
    【★★★★★ 第8章 排序 2022 9.10】
    echarts 各个配置项详细说明总结
    【Unity ShaderGraph】| 给模型添加一个 边缘光效果 实战
    安卓NDK开发
    设计模式学习(十三):观察者模式
    node中文件的上传
    [项目管理-1]:软硬件项目管理 - 总体概述、框架、实践活动、常见工具、软件研发过程、软件开发周期模型
    掌握分布式环境缓存更新策略,提高缓存与数据库数据一致性
    密码学系列之:使用openssl检测网站是否支持ocsp
  • 原文地址:https://blog.csdn.net/yangchuang11/article/details/138115141