面试题答案
一键面试设计思路
- 使用
CoroutineScope
来管理协程:通过创建一个CoroutineScope
,在该作用域内启动所有相关协程,这样当需要取消协程时,可以统一操作。 - 异常处理:使用
try - catch
块来捕获单个协程内的异常,然后通过GlobalScope.cancel()
方法取消整个CoroutineScope
,从而取消所有相关协程。同时,可以使用一个MutableList
来收集所有抛出的异常。 - 性能和资源释放:Kotlin的协程机制本身就轻量级,通过正确使用
CoroutineScope
和Job
,在取消协程时,Kotlin会自动释放相关资源。
关键代码示例
import kotlinx.coroutines.*
fun main() = runBlocking {
val exceptionList = mutableListOf<Throwable>()
val coroutineScope = CoroutineScope(Job())
val job1 = coroutineScope.launch {
try {
// 模拟协程任务
delay(1000)
println("Job 1 is running")
throw RuntimeException("Job 1 exception")
} catch (e: Throwable) {
exceptionList.add(e)
coroutineScope.cancel()
}
}
val job2 = coroutineScope.launch {
try {
// 模拟另一个协程任务
delay(2000)
println("Job 2 is running")
} catch (e: Throwable) {
exceptionList.add(e)
coroutineScope.cancel()
}
}
job1.join()
job2.join()
if (exceptionList.isNotEmpty()) {
println("Collected exceptions:")
exceptionList.forEach { println(it.message) }
}
}
在上述代码中:
- 首先创建了一个
CoroutineScope
,并在该作用域内启动了两个协程job1
和job2
。 - 每个协程内部使用
try - catch
块捕获异常,捕获到异常后将异常添加到exceptionList
,并取消整个CoroutineScope
,从而取消所有相关协程。 - 最后,在所有协程执行完毕后,检查
exceptionList
,如果有异常则统一处理。