我希望在线程级别或协同级别上维护一个对象,具体取决于应用程序跨不同线程/协同值所做的工作类型。有办法做到这一点吗?
为了简单起见,为了简单起见,我可以编写一个Spring应用程序,在这个应用程序中,许多事情都是基于线程发生的,而且只有代码的某些部分使用协同机制来利用它们的好处。如何根据当前的执行维护状态?有办法这样做吗?
发布于 2022-08-10 11:18:35
也许我的回答有点晚了,但你可以
ContinuationInterceptorCopyableThreadContextElement更详细的答案和例子提供了here。
下面我将展示一个从这些答案中复制出来的ContinuationInterceptor示例。
class WrappedDispatcher(
private val dispatcher: ContinuationInterceptor,
private var savedCounter: Int = counterThreadLocal.get() ?: 0
) : AbstractCoroutineContextElement(ContinuationInterceptor), ContinuationInterceptor {
override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> =
dispatcher.interceptContinuation(ContinuationWrapper(continuation))
private inner class ContinuationWrapper<T>(val base: Continuation<T>) : Continuation<T> by base {
override fun resumeWith(result: Result<T>) {
counterThreadLocal.set(savedCounter)
try {
base.resumeWith(result)
} finally {
savedCounter = counterThreadLocal.get()
}
}
}
}和使用
val counterThreadLocal: ThreadLocal<Int> = ThreadLocal()
fun showCounter() {
println("-------------------------------------------------")
println("Thread: ${Thread.currentThread().name}\n Counter value: ${counterThreadLocal.get()}")
}
fun main() {
runBlocking(WrappedDispatcher(Dispatchers.IO)) {
showCounter()
counterThreadLocal.set(2)
delay(100)
showCounter()
counterThreadLocal.set(3)
withContext(WrappedDispatcher(Dispatchers.Default)) {
println("__________NESTED START___________")
counterThreadLocal.set(4)
showCounter()
println("__________NESTED END_____________")
}
delay(100)
showCounter()
}
}输出将
-------------------------------------------------
Thread: DefaultDispatcher-worker-1
Counter value: 0
-------------------------------------------------
Thread: DefaultDispatcher-worker-1
Counter value: 2
__________NESTED START___________
-------------------------------------------------
Thread: DefaultDispatcher-worker-3
Counter value: 4
__________NESTED END_____________
-------------------------------------------------
Thread: DefaultDispatcher-worker-3
Counter value: 3https://stackoverflow.com/questions/67478164
复制相似问题