|
一、协程作用域构建器
1、coroutineScope与runBlocking
1)runBlocking是常规函数,而coroutineScope是挂起函数;
2)它们都会等待其协程体以及所有子协程结束,主要区别在于runBlocking方法会阻塞当前线程来等待,而coroutineScope只是挂起,会释放底层线程用于其他用途。
2、coroutineScope与supervisorScope
1)coroutineScope:一个协程失败了,所有其他兄弟协程也会被取消;
2)supervisorScope:一个协程失败了,不会影响其他兄弟协程。
二、coroutineScope
/**
* 测试协程作用域构建器
*/
@Test
fun testCoroutineScopeBuilder() = runBlocking {
coroutineScope {
val job1 = launch {
delay(400)
println("job1 完成了")
}
val job2 = async {
delay(200)
println("job2 完成了")
"job2 返回值"
// throw IllegalArgumentException("我是协程2抛出的异常")
}
}
执行结果:
09-12 17:16:36.635 11673 11695 I System.out: job2 完成了
09-12 17:16:36.837 11673 11695 I System.out: job1 完成了三、coroutineScope (子协程抛异常)
/**
* 测试协程作用域构建器(子协程抛出异常的状态)
*/
@Test
fun testCoroutineScopeBuilder1() = runBlocking {
coroutineScope {
val job1 = launch {
delay(400)
println("job1 完成了")
}
val job2 = async {
delay(200)
println("job2 完成了")
"job2 返回值"
throw IllegalArgumentException("我是协程2抛出的异常")
}
}
}
执行结果:
09-12 17:19:37.314 11902 11924 I System.out: job2 完成了
09-12 17:19:37.317 11902 11924 E TestRunner: failed: testCoroutineScopeBuilder1(com.young.testcoroutine.CoroutineTest04)
09-12 17:19:37.317 11902 11924 E TestRunner: ----- begin exception -----
09-12 17:19:37.318 11902 11924 E TestRunner: java.lang.IllegalArgumentException: 我是协程2抛出的异常
09-12 17:19:37.318 11902 11924 E TestRunner: at com.young.testcoroutine.CoroutineTest04$testCoroutineScopeBuilder1$1$1$job2$1.invokeSuspend(CoroutineTest04.kt:52)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:227)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:362)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:396)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:388)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.CancellableContinuationImpl.resumeUndispatched(CancellableContinuationImpl.kt:484)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.run(EventLoop.common.kt:489)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:84)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source:1)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
09-12 17:19:37.318 11902 11924 E TestRunner: at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source:1)
09-12 17:19:37.318 11902 11924 E TestRunner: at com.young.testcoroutine.CoroutineTest04.testCoroutineScopeBuilder1(CoroutineTest04.kt:41)
09-12 17:19:37.318 11902 11924 E TestRunner: at java.lang.reflect.Method.invoke(Native Method)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.Suite.runChild(Suite.java:128)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.Suite.runChild(Suite.java:27)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
09-12 17:19:37.318 11902 11924 E TestRunner: at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
09-12 17:19:37.318 11902 11924 E TestRunner: at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
09-12 17:19:37.318 11902 11924 E TestRunner: at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:444)
09-12 17:19:37.318 11902 11924 E TestRunner: at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2205)
09-12 17:19:37.318 11902 11924 E TestRunner: ----- end exception -----
09-12 17:19:37.321 11902 11924 I TestRunner: finished: testCoroutineScopeBuilder1(com.young.testcoroutine.CoroutineTest04)
四、supervisorScope(子协程抛异常)
/**
* 测试 supervisorScope
*/
@Test
fun testSupervisorScopeBuilder() = runBlocking {
supervisorScope {
val job1 = launch {
delay(400)
println("job1 完成了")
}
val job2 = async {
delay(200)
println("job2 完成了")
"job2 返回值"
throw IllegalArgumentException("我是协程2抛出的异常")
}
}
}
执行结果:
09-12 17:27:18.841 12131 12153 I System.out: job2 完成了
09-12 17:27:19.041 12131 12153 I System.out: job1 完成了 |
|