首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程本地/协作--上下文桥接间隙

线程本地/协作--上下文桥接间隙
EN

Stack Overflow用户
提问于 2021-05-10 21:59:29
回答 1查看 338关注 0票数 2

我希望在线程级别或协同级别上维护一个对象,具体取决于应用程序跨不同线程/协同值所做的工作类型。有办法做到这一点吗?

为了简单起见,为了简单起见,我可以编写一个Spring应用程序,在这个应用程序中,许多事情都是基于线程发生的,而且只有代码的某些部分使用协同机制来利用它们的好处。如何根据当前的执行维护状态?有办法这样做吗?

EN

回答 1

Stack Overflow用户

发布于 2022-08-10 11:18:35

也许我的回答有点晚了,但你可以

  1. ContinuationInterceptor
  2. CopyableThreadContextElement

更详细的答案和例子提供了here

下面我将展示一个从这些答案中复制出来的ContinuationInterceptor示例。

代码语言:javascript
复制
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()
            }
        }
    }
}

和使用

代码语言:javascript
复制
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()
    }
}

输出将

代码语言:javascript
复制
-------------------------------------------------
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: 3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67478164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档