前言:
Kotlin 协程是基于 Coroutine 实现的,其设计目的是简化异步编程。协程提供了一种方式,可以在一个线程上写起来像是在多个线程中执行。
协程的基本概念:
-
协程是轻量级的,不会创建新的线程。
-
协程会挂起当前的协程,而不会阻塞线程。
-
协程可以在suspend函数中暂停执行,并在暂停点恢复执行。
一、引包
${kotlin.version} : <kotlin.version>1.8.21</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>
二、 interface 定义
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(): Stringfun te()
}
三、Ipml 实现
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")}
}
四、controller
/*** @author zc* @date 2024/4/18 10:38* @desc*/
@RestController
@RequestMapping("/price")
@Tag(name = "kotlin")
class TestKotlinController {@Autowiredprivate 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,异步调用成功
六、学习文档:
文档 · Kotlin 官方文档 中文版