200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Kotlin协程使用 协程使用注意事项 协程中的await方法使用|不使用suspend使用协程

Kotlin协程使用 协程使用注意事项 协程中的await方法使用|不使用suspend使用协程

时间:2020-03-08 10:41:52

相关推荐

Kotlin协程使用 协程使用注意事项 协程中的await方法使用|不使用suspend使用协程

参见 码云

协程使用方法一 (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的原因。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。