# kotlin协程 kotlin+SpringBoot+mybatis+gradle **Repository Path**: ck_567/kotlin-coroutine ## Basic Information - **Project Name**: kotlin协程 kotlin+SpringBoot+mybatis+gradle - **Description**: kotlin协程 kotlin+SpringBoot+mybatis+gradle - **Primary Language**: Kotlin - **License**: MPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 1 - **Created**: 2021-06-08 - **Last Updated**: 2023-12-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 协程使用方法一 (Dispatchers调度器模式) ##### 指定不同线程。同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) ````kotlin withContext(Dispatchers.IO) { // 👈 切换到 IO 线程,并在执行完成后切回 UI 线程 println("1") delay(1000) } ```` ### 协程使用方法二 (GlobalScope.async) > 使用GlobalScope.async返回Deferred类型对象。 继承自 Job 接口,额外提供了获取 Coroutine 返回结果的方法。 获取返回结果 > ##### getCompleted() ###### getCompleted() 函数用来获取Coroutine执行的结果。如果Coroutine还没有执行完成则会抛出 IllegalStateException ,如果任务被取消了也会抛出对应的异常。所以在执行这个函数之前,可以通过 isCompleted 来判断一下当前任务是否执行完毕了。 ````kotlin val s: Deferred = GlobalScope.async { delay(2000L) println("1") "200" } ```` ### 协程使用方法三 (挂起声明 suspend) > suspend使用时,需注意: > > suspend只是一个声明,并不会启动协程。需要在内部使用withContext等协程声明才能启动非阻塞。 > > suspend声明需要整个调用链都声明suspend,web项目需要从controller一直声明到dao,suspend只能被suspend调用。 > > suspend需要使用spring-boot-starter-webflux响应式框架,而不能使用spring-boot-starter-web,这也是老项目不使用suspend的原因。