MST

星途 面试题库

面试题:Kotlin中协程的启动方式及区别

请阐述Kotlin中协程的launch、async和runBlocking这几种启动方式的特点以及它们在使用场景上有什么区别。
38.2万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

launch

  1. 特点
    • 启动一个新的协程并立即返回一个 Job 对象,它表示这个协程的句柄。
    • 协程以异步非阻塞的方式执行,不会阻塞当前线程。
    • 它并不返回任何结果,适合执行不需要返回值的异步任务,比如日志记录、后台数据更新等。
  2. 使用场景
    • 当你需要执行一些后台任务,并且不关心其执行结果时使用。例如,在应用中向服务器发送一些无返回值的状态更新请求,或者在后台清理缓存文件等操作。

async

  1. 特点
    • 同样启动一个新的协程并返回一个 Deferred 对象,Deferred 继承自 Job,它不仅可以控制协程的生命周期,还能获取协程的执行结果。
    • 协程以异步非阻塞方式执行。
    • 要获取 async 启动的协程结果,需要调用 Deferred 对象的 await() 方法,await() 方法会挂起当前协程,直到 async 协程执行完成并返回结果。
  2. 使用场景
    • 当你需要异步执行一个任务并获取其返回结果时使用。比如从网络获取数据、进行数据库查询并需要处理查询结果等场景。例如,多个网络请求并发执行,最后将各个请求的结果汇总处理。

runBlocking

  1. 特点
    • 它会阻塞当前线程,直到其内部的协程执行完毕。
    • 通常用于在主线程中启动和等待协程的完成,例如在 main 函数中或者测试代码中使用。
    • 可以作为协程世界和非协程世界的桥梁,因为它可以在非协程环境(如普通的Java或Kotlin函数)中启动协程并等待其完成。
  2. 使用场景
    • main 函数中启动协程来执行一些异步任务,由于 main 函数所在线程需要等待协程执行完毕才能正常退出,所以 runBlocking 可以满足这个需求。在测试代码中,也经常使用 runBlocking 来启动协程并等待其执行结果以便进行断言等操作。