参见 码云
协程使用方法一 (Dispatchers调度器模式)
指定不同线程。同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞)
withContext(Dispatchers.IO) {// 👈 切换到 IO 线程,并在执行完成后切回 UI 线程println("1")delay(1000)}
协程使用方法二 (GlobalScope.async)
使用GlobalScope.async返回Deferred类型对象。
继承自 Job 接口,额外提供了获取 Coroutine 返回结果的方法。
获取返回结果
getCompleted()
getCompleted() 函数用来获取Coroutine执行的结果。如果Coroutine还没有执行完成则会抛出 IllegalStateException ,如果任务被取消了也会抛出对应的异常。所以在执行这个函数之前,可以通过 isCompleted 来判断一下当前任务是否执行完毕了。
更新await
方法,可延迟获取结果(即iscompleted为true的时候的结果),无需空循环判断。使用await方法需要注意,它需要在被suspend修饰的或者协程高阶函数中使用。如:runblocking{}
val s: Deferred<String> = GlobalScope.async {delay(2000L)println("1")"200"}
这种方法如果不去等待getCompleted()执行完成,就是完全异步执行的。相比runblocking,它的性能无疑是更优秀的。
协程使用方法三 (挂起声明 suspend)
suspend使用时,需注意:
suspend只是一个声明,并不会启动协程。需要在内部使用withContext等协程声明才能启动非阻塞。suspend声明需要整个调用链都声明suspend,web项目需要从controller一直声明到dao,suspend只能被suspend调用。suspend需要使用spring-boot-starter-webflux响应式框架,而不能使用spring-boot-starter-web,这也是老项目不使用suspend的原因。