如何用Kotlin Coroutines并行执行多异步任务并统计各任务耗时?
Kotlin协程并行任务实现思路与代码示例
核心思路
- 用
async创建并行任务:每个异步任务通过async包装,在指定调度器(如Dispatchers.Default)下并行执行 - 单独统计每个任务耗时:在任务执行前后记录系统时间戳,计算时间差得到单任务耗时
- 用
awaitAll批量收集结果:一次性等待所有Deferred完成,统一获取所有任务的结果与耗时数据
代码示例
import kotlinx.coroutines.* import kotlin.system.measureTimeMillis // 模拟耗时任务,返回任务结果 private suspend fun doTask(taskId: Int, delayMs: Long): String { delay(delayMs) return "Task $taskId completed" } data class TaskResult(val result: String, val costTimeMs: Long) fun main() = runBlocking { // 定义要执行的任务参数:任务ID、模拟耗时 val taskParams = listOf(1 to 1000, 2 to 1500, 3 to 800) // 启动所有并行任务,每个任务记录耗时 val deferredTasks = taskParams.map { (id, delay) -> async(Dispatchers.Default) { val costTime = measureTimeMillis { doTask(id, delay) } TaskResult(doTask(id, delay), costTime) } } // 等待所有任务完成,收集结果 val allResults = deferredTasks.awaitAll() // 输出每个任务的结果与耗时 allResults.forEach { println("${it.result}, 耗时:${it.costTimeMs}ms") } // 输出总耗时(由于并行,总耗时接近最长的单个任务耗时) val totalCost = measureTimeMillis { deferredTasks.awaitAll() } println("总耗时:${totalCost}ms") }
说明
measureTimeMillis是Kotlin标准库工具,用于快速计算代码块的执行耗时async启动的任务会在后台并行执行,awaitAll会阻塞当前协程直到所有任务完成- 可以根据实际需求替换
Dispatchers.Default为其他调度器(如Dispatchers.IO处理IO密集型任务)
内容的提问来源于stack exchange,提问作者Faruk
相关产品推荐
相关产品推荐

