取消对null_协程中的取消和异常 | 取消操作详解
时间: 2024-06-08 12:05:14 浏览: 9
在协程中,可以使用协程作用域中的 `cancel()` 函数来取消一个协程。当协程被取消时,它会抛出一个 `CancellationException` 异常。如果在协程中捕获了这个异常,那么协程的执行会立即结束。
然而,在某些情况下,我们可能不想让协程被取消,或者不想让它在取消时抛出异常。这时候我们就可以使用 `SupervisorJob` 和 `SupervisorScope` 来管理协程的取消操作。
`SupervisorJob` 是一个特殊的 `Job` 类型,它会将所有子协程放入一个单独的协程作用域中,从而使它们互相独立。当一个子协程被取消时,其它子协程不会受到影响。同时,如果使用 `SupervisorScope` 来启动子协程,则在取消时也不会抛出 `CancellationException` 异常。
下面是一个例子,展示了如何在协程中使用 `SupervisorJob` 和 `SupervisorScope`:
```kotlin
import kotlinx.coroutines.*
fun main() = runBlocking {
val supervisor = SupervisorJob()
val scope = CoroutineScope(coroutineContext + supervisor)
val job1 = scope.launch {
println("Child coroutine 1 started")
delay(1000)
println("Child coroutine 1 completed")
}
val job2 = scope.launch {
println("Child coroutine 2 started")
try {
delay(3000)
println("Child coroutine 2 completed")
} catch (e: CancellationException) {
// do nothing
}
}
delay(2000)
job1.cancel()
job2.cancel()
supervisor.children.forEach { it.join() }
println("All coroutines completed")
}
```
在这个例子中,我们首先创建了一个 `SupervisorJob`,然后使用它来创建一个协程作用域。在协程作用域中,我们创建了两个子协程 `job1` 和 `job2`。在 `job1` 中,我们没有使用 `SupervisorScope`,所以在取消时会抛出 `CancellationException` 异常。而在 `job2` 中,我们使用了 `SupervisorScope`,所以在取消时不会抛出异常。
最后,我们通过遍历 `supervisor.children` 来等待所有子协程执行完毕,并输出 "All coroutines completed"。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)