alibaba / transmittable-thread-local

📌 a missing Java std lib(simple & 0-dependency) for framework/middleware, provide an enhanced InheritableThreadLocal that transmits values between threads even using thread pooling components.
https://github.com/alibaba/transmittable-thread-local
Apache License 2.0
7.59k stars 1.69k forks source link

关于实现:在TtlRunnable.get(task)初始化中完成TTL的值抓取,即TtlRunnable.get初始之后的TTL值不会被传递 #127

Closed LQZYC closed 5 years ago

LQZYC commented 5 years ago
import com.alibaba.ttl.TransmittableThreadLocal;
import com.alibaba.ttl.TtlRunnable;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Scratch {
    public static void main(String[] args) {

        TransmittableThreadLocal<String> parent0 = new TransmittableThreadLocal<String>();
        TransmittableThreadLocal<String> parent1 = new TransmittableThreadLocal<String>();
        parent0.set("parent0");

        Runnable task = () -> {
            System.out.println(parent0.get());
            System.out.println(parent1.get());
        };
        Runnable ttlRunnable = TtlRunnable.get(task);
        parent1.set("parent1");

        ExecutorService executorService = Executors.newFixedThreadPool(8);
        executorService.submit(ttlRunnable);

        executorService.shutdown();
    }
}

以上代码输出为

parent0
null

无法获取到parent1对象在父线程设置的值。

代码如果parent1.set("parent1")Runnable ttlRunnable = TtlRunnable.get(task)初始化之前设置才可以看到。

LQZYC commented 5 years ago

看了下代码是这里删除了

com.alibaba.ttl.TransmittableThreadLocal.Transmitter#replay

// clear the TTL values that is not in captured
// avoid the extra TTL values after replay when run task
if (!capturedMap.containsKey(threadLocal)) {
    iterator.remove();
    threadLocal.superRemove();
}

是专门设计的吗?只能捕获TtlRunnable创建前父线程中设置的上下文?

oldratlee commented 5 years ago

无法获取到parent1对象在父线程设置的值。

代码如果parent1.set("parent1")Runnable ttlRunnable = TtlRunnable.get(task)初始化之前设置才可以看到。

@LQZYC 是 如你说的。

抓取 父操作的TTL的值 发生在 TtlRunnable.get,即在这个操作之后不会传递。


看了下代码是这里删除了

这里删除操作:

是专门设计的吗?只能捕获TtlRunnable创建前父线程中设置的上下文?

是专门设计的。这样整个流程 固定明确,可以方便分析推理。


如果上面说的理解有些困难,可以先看一下关于TTL的Issue:

讨论和使用注意参见

oldratlee commented 5 years ago

@LQZYC 这样的设计,可以 解决 复杂&典型的场景,并能简化使用和系统分析。

可以 说一下你的场景?你有碰到的 什么 不能解决的场景 或问题吗? 😃