Kotlin 协程是基于 Coroutine 实现的,其设计目的是简化异步编程。协程提供了一种方式,可以在一个线程上写起来像是在多个线程中执行。
协程的基本概念:
协程是轻量级的,不会创建新的线程。
协程会挂起当前的协程,而不会阻塞线程。
协程可以在suspend函数中暂停执行,并在暂停点恢复执行。
${kotlin.version} :
注意:org.jetbrains.kotlinx 最新在1.6.0
- <dependency>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-stdlib-jdk8</artifactId>
- <version>${kotlin.version}</version>
- </dependency>
- <dependency>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-reflect</artifactId>
- <version>${kotlin.version}</version>
- </dependency>
- <dependency>
- <groupId>org.jetbrains.kotlinx</groupId>
- <artifactId>kotlinx-coroutines-core</artifactId>
- <version>1.6.0</version>
- </dependency>
- <dependency>
- <groupId>org.jetbrains.kotlin</groupId>
- <artifactId>kotlin-test</artifactId>
- <version>${kotlin.version}</version>
- <scope>test</scope>
- </dependency>
- import com.baomidou.mybatisplus.extension.service.IService
- import com.zc.bean.PriceBean
- import org.springframework.stereotype.Repository
-
- @Repository
- interface TestKotlinService : IService<PriceBean> {
- //suspend 协程方法的定义
- suspend fun test(): String
- fun te()
- }
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
- import com.zc.bean.PriceBean
- import com.zc.mapper.TestKotlinMapper
- import kotlinx.coroutines.Dispatchers
- import kotlinx.coroutines.delay
- import kotlinx.coroutines.withContext
- import lombok.extern.slf4j.Slf4j
- import org.springframework.stereotype.Service
-
- /**
- * @author zc
- * @date 2024/4/18 9:56
- * @desc
- */
- @Service
- @Slf4j
- open class TestKotlinServcieImpl : ServiceImpl<TestKotlinMapper, PriceBean>(), TestKotlinService{
- //withContext 切换到指定的线程(IO线程)
- override suspend fun test() = withContext(Dispatchers.IO){
- delay(10000)
- println("suspend")
- return@withContext "success"
- }
-
- override fun te(){
- println("test")
- }
- }
- /**
- * @author zc
- * @date 2024/4/18 10:38
- * @desc
- */
- @RestController
- @RequestMapping("/price")
- @Tag(name = "kotlin")
- class TestKotlinController {
-
- @Autowired
- private lateinit var testKotlinService: TestKotlinService;
-
- @GetMapping("test")
- fun testScope(){
- println("start")
- testKotlinService.te()
- //创建协程,并在io线程上执行
- val coroutineScope = CoroutineScope(Dispatchers.IO)
- coroutineScope.launch {
- //async/await获取返回值
- // val result = async { testKotlinService.test() }.await()
- val result =
- withContext(Dispatchers.IO) { testKotlinService.test() }
- println("result: $result")
- }
- println("end")
- }
- }
调用swagger 接口测试,在等待10秒后打印出suspend result: success,异步调用成功