diff --git a/utils/src/main/kotlin/cn/tursom/utils/coroutine/CoroutineScopeContext.kt b/utils/src/main/kotlin/cn/tursom/utils/coroutine/CoroutineScopeContext.kt index 4c535ef..4c02a63 100644 --- a/utils/src/main/kotlin/cn/tursom/utils/coroutine/CoroutineScopeContext.kt +++ b/utils/src/main/kotlin/cn/tursom/utils/coroutine/CoroutineScopeContext.kt @@ -6,7 +6,7 @@ import kotlin.coroutines.CoroutineContext import kotlin.coroutines.coroutineContext class CoroutineScopeContext( - var coroutineScope: CoroutineScope + var coroutineScope: CoroutineScope = GlobalScope ) : CoroutineContext.Element { override val key: CoroutineContext.Key<*> get() = Companion override fun toString(): String = "CoroutineScopeContext(coroutineScope=$coroutineScope)" diff --git a/utils/src/main/kotlin/cn/tursom/utils/coroutine/utils.kt b/utils/src/main/kotlin/cn/tursom/utils/coroutine/utils.kt index 8d66ff3..f9397d5 100644 --- a/utils/src/main/kotlin/cn/tursom/utils/coroutine/utils.kt +++ b/utils/src/main/kotlin/cn/tursom/utils/coroutine/utils.kt @@ -75,3 +75,15 @@ fun CoroutineScope.asyncWithCoroutineLocalAndCoroutineScopeContext( ): Deferred { return async(context + CoroutineLocalContext(map) + CoroutineScopeContext(this), start, block) } + +@Throws(InterruptedException::class) +fun runBlockingWithCoroutineLocalAndCoroutineScopeContext( + context: CoroutineContext = EmptyCoroutineContext, + map: MutableMap, Any?> = HashMap(4), + block: suspend CoroutineScope.() -> T +): T { + return runBlocking(context + CoroutineLocalContext(map) + CoroutineScopeContext()) { + CoroutineScopeContext set this + block() + } +} diff --git a/utils/src/test/kotlin/cn/tursom/utils/coroutine/CoroutineLocalTest.kt b/utils/src/test/kotlin/cn/tursom/utils/coroutine/CoroutineLocalTest.kt index 1fbaf89..108eec9 100644 --- a/utils/src/test/kotlin/cn/tursom/utils/coroutine/CoroutineLocalTest.kt +++ b/utils/src/test/kotlin/cn/tursom/utils/coroutine/CoroutineLocalTest.kt @@ -1,6 +1,5 @@ package cn.tursom.utils.coroutine -import cn.tursom.core.usingTime import kotlinx.coroutines.delay val testCoroutineLocal = CoroutineLocal() @@ -8,21 +7,17 @@ val testCoroutineLocalList = Array(100000) { CoroutineLocal() }.asList() -fun main() = runBlockingWithCoroutineLocalContext { +fun main() = runBlockingWithCoroutineLocalAndCoroutineScopeContext { println(coroutineContext) - launchWithCoroutineLocalAndCoroutineScopeContext { + CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext { println(coroutineContext) println(CoroutineScopeContext.get()) - testCoroutineLocal set 0 - testCoroutineLocal set 0 - testCoroutineLocalList.forEachIndexed { index, coroutineLocal -> - coroutineLocal set index + println(Thread.currentThread().name) + CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext { + println(coroutineContext) + println(CoroutineScopeContext.get()) + println(Thread.currentThread().name) } - println(usingTime { - repeat(10000000) { - testCoroutineLocal.get() - } - }) }.join() delay(1000) println(CoroutineLocal)