协程Job
1. 什么是Job
Job 是协程的生命周期管理者。每一个协程都有一个关联的 Job, Job 可以用来控制协程的 执行、取消、等待等操作。
当启动一个协程时,Job 会自动关联到协程。例如,launch 或者 async 创建的协程都会返回一个 Job,可以使用这个 Job 来管理协程。
2. 协程与Job的关系
Job 可以通过以下方法控制协程:
cancel(): 取消协程。join(): 等待协程完成。isActive(): 检查协程是否处于活动状态isCompleted(): 检查协程是否已经完成isCancelled(): 检查协程是否已被取消
3. Job 和协程的生命周期
- 启动阶段:协程被创建并开始执行
- 运行阶段:协程正在执行代码
- 取消阶段:协程被取消后会中断执行,通常会抛出
CancellationException。 - 完成阶段:协程的工作完成,退出执行。
4. 父子协程与Job
协程可以嵌套,也就是说一个协程可以启动另一个协程,这时父协程和子协程会形成父子关系。父协程的 Job 和子协程的 Job 相关联,子协程的 Job 会作为父协程的子任务。
- 父协程取消子协程 如果父协程被取消,那么所有子协程也会被取消,除非子协程在启动时指定了不同的 Job。
kotlin
val parentJob = launch {
val childJob = launch {
delay(1000)
println("子协程完成!")
}
delay(500)
println("父协程取消!")
parentJob.cancel() // 取消父协程
}
// 此时,parentJob 被取消后,childJob 会被自动取消。- 子协程独立于父协程 通过显式传递 Job,使子协程独立于父协程:
kotlin
val parentJob = launch {
val childJob = launch(parentJob) {
delay(1000)
println("子协程完成!")
}
}
// 即使父协程被取消,子协程也不会被自动取消。5. 代码示例
- cancel方法
kotlin
val job = launch {
delay(1000)
println("这条不会被执行")
}
job.cancel()- join方法
kotlin
val job = launch {
delay(1000)
println("协程完成")
}
job.join()
println("主线程继续执行")- isActive方法
kotlin
val job = launch {
delay(1000)
println("协程完成")
}
println(job.isActive) // true 正在执行
job.join()
println(job.isActive) // false 协程已经完成- isCompleted 和 isCancelled方法不同
kotlin
val job = launch {
delay(1000)
}
println(job.isCompleted) // false
println(job.isCancelled) // false
job.cancel()
println(job.isCompleted) // true
println(job.isCancelled) // true