Android面试题之Kotlin中如何实现串行和并行任务?

简介: 本文介绍了 Kotlin 中 `async` 和 `await` 在并发编程中的应用,包括并行与串行任务的处理方法。并通过示例代码展示了如何启动并收集异步任务的结果。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在 Kotlin 中,asyncawait 是用于并发编程的关键工具。它们通常用于协程中,以实现异步编程模式。通过使用 asyncawait,你可以编写简洁的代码来处理并行任务,还可以控制任务的执行顺序来实现串行任务。

并行任务

async 会启动一个新的协程,并在其中异步执行指定的代码块。它会立即返回一个 Deferred 对象,该对象代表未来的结果。await 是用于等待 Deferred 的结果,直到它的计算完成。

下面是一个简单的例子,演示如何使用 asyncawait 来并行执行两个异步任务:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val startTime = System.currentTimeMillis()

    // 启动两个并行任务
    val deferred1 = async { simulatedLongTask("Task 1", 1000L) }
    val deferred2 = async { simulatedLongTask("Task 2", 1500L) }

    // 等待两个任务都完成
    val result1 = deferred1.await()
    val result2 = deferred2.await()

    println("Result1: $result1")
    println("Result2: $result2")

    val endTime = System.currentTimeMillis()
    println("Total time: ${endTime - startTime} ms")
}

suspend fun simulatedLongTask(name: String, delayTime: Long): String {
    println("$name started")
    delay(delayTime) // 模拟长时间运行的任务
    println("$name finished")
    return "$name result"
}

在这个例子中,simulatedLongTask 模拟了一个长时间运行的任务。async 用于并行执行两个任务,这两个任务在等待完成时不会阻塞主线程。当所有任务完成时,await 收集它们的结果。

串行任务

尽管 asyncawait 可以用于并行处理,但它们也可以用于顺序执行任务。如果你在调用 async 的地方使用 await,那么代码将是同步执行的:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val startTime = System.currentTimeMillis()

    // 启动串行任务
    val result1 = async { simulatedLongTask("Task 1", 1000L) }.await()
    val result2 = async { simulatedLongTask("Task 2", 1500L) }.await()

    println("Result1: $result1")
    println("Result2: $result2")

    val endTime = System.currentTimeMillis()
    println("Total time: ${endTime - startTime} ms")
}

suspend fun simulatedLongTask(name: String, delayTime: Long): String {
    println("$name started")
    delay(delayTime) // 模拟长时间运行的任务
    println("$name finished")
    return "$name result"
}

在这个串行任务的示例中,每个任务在前一个任务完成后才开始执行。虽然仍然使用了 async,但由于 await 紧随其后,所以任务是顺序执行的。

关键点

  • 并行执行:使用 async 启动多个任务,并且在所有任务启动后使用 await 收集结果。
  • 串行执行:在每个任务后立即使用 await,以确保下一个任务只有在当前任务完成后才启动。
  • runBlocking:用来在主函数中启动协程,这在演示和划小范围测试中很有用,但在应用中,应使用更合适的结构如 launchCoroutineScope

欢迎关注我的公众号AntDream查看更多精彩文章,领取面试资料!

目录
相关文章
|
2月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
85 6
|
2月前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
2月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
31 1
|
2月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
28 3
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
26 2
|
2月前
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
54 1
|
2月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
39 1
|
2月前
|
NoSQL Java API
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试一线互联网企业时遇到了关于Redis分布式锁过期及自动续期的问题。尼恩对此进行了系统化的梳理,介绍了两种核心解决方案:一是通过增加版本号实现乐观锁,二是利用watch dog自动续期机制。后者通过后台线程定期检查锁的状态并在必要时延长锁的过期时间,确保锁不会因超时而意外释放。尼恩还分享了详细的代码实现和原理分析,帮助读者深入理解并掌握这些技术点,以便在面试中自信应对相关问题。更多技术细节和面试准备资料可在尼恩的技术文章和《尼恩Java面试宝典》中获取。
美团面试:Redis锁如何续期?Redis锁超时,任务没完怎么办?