add CoroutineScopeContext

This commit is contained in:
tursom 2020-07-18 02:44:51 +08:00
parent a9137789db
commit 9b80eabdf0
3 changed files with 20 additions and 13 deletions

View File

@ -6,7 +6,7 @@ import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.coroutineContext import kotlin.coroutines.coroutineContext
class CoroutineScopeContext( class CoroutineScopeContext(
var coroutineScope: CoroutineScope var coroutineScope: CoroutineScope = GlobalScope
) : CoroutineContext.Element { ) : CoroutineContext.Element {
override val key: CoroutineContext.Key<*> get() = Companion override val key: CoroutineContext.Key<*> get() = Companion
override fun toString(): String = "CoroutineScopeContext(coroutineScope=$coroutineScope)" override fun toString(): String = "CoroutineScopeContext(coroutineScope=$coroutineScope)"

View File

@ -75,3 +75,15 @@ fun <T> CoroutineScope.asyncWithCoroutineLocalAndCoroutineScopeContext(
): Deferred<T> { ): Deferred<T> {
return async(context + CoroutineLocalContext(map) + CoroutineScopeContext(this), start, block) return async(context + CoroutineLocalContext(map) + CoroutineScopeContext(this), start, block)
} }
@Throws(InterruptedException::class)
fun <T> runBlockingWithCoroutineLocalAndCoroutineScopeContext(
context: CoroutineContext = EmptyCoroutineContext,
map: MutableMap<CoroutineLocal<*>, Any?> = HashMap(4),
block: suspend CoroutineScope.() -> T
): T {
return runBlocking(context + CoroutineLocalContext(map) + CoroutineScopeContext()) {
CoroutineScopeContext set this
block()
}
}

View File

@ -1,6 +1,5 @@
package cn.tursom.utils.coroutine package cn.tursom.utils.coroutine
import cn.tursom.core.usingTime
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
val testCoroutineLocal = CoroutineLocal<Int>() val testCoroutineLocal = CoroutineLocal<Int>()
@ -8,21 +7,17 @@ val testCoroutineLocalList = Array(100000) {
CoroutineLocal<Int>() CoroutineLocal<Int>()
}.asList() }.asList()
fun main() = runBlockingWithCoroutineLocalContext { fun main() = runBlockingWithCoroutineLocalAndCoroutineScopeContext {
println(coroutineContext) println(coroutineContext)
launchWithCoroutineLocalAndCoroutineScopeContext { CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext {
println(coroutineContext) println(coroutineContext)
println(CoroutineScopeContext.get()) println(CoroutineScopeContext.get())
testCoroutineLocal set 0 println(Thread.currentThread().name)
testCoroutineLocal set 0 CoroutineScopeContext.get().launchWithCoroutineLocalAndCoroutineScopeContext {
testCoroutineLocalList.forEachIndexed { index, coroutineLocal -> println(coroutineContext)
coroutineLocal set index println(CoroutineScopeContext.get())
println(Thread.currentThread().name)
} }
println(usingTime {
repeat(10000000) {
testCoroutineLocal.get()
}
})
}.join() }.join()
delay(1000) delay(1000)
println(CoroutineLocal) println(CoroutineLocal)