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
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)"

View File

@ -75,3 +75,15 @@ fun <T> CoroutineScope.asyncWithCoroutineLocalAndCoroutineScopeContext(
): Deferred<T> {
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
import cn.tursom.core.usingTime
import kotlinx.coroutines.delay
val testCoroutineLocal = CoroutineLocal<Int>()
@ -8,21 +7,17 @@ val testCoroutineLocalList = Array(100000) {
CoroutineLocal<Int>()
}.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)