当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-父子线程怎么共享数据

金三银四精选java面试题-父子线程怎么共享数据

来源:图灵教育
时间:2023-12-08 10:20:42
 

父子线程怎么共享数据

父线程能用ThreadLocal来给子线程传值吗?毫无疑问,不能。那该怎么办?

这时候可以用到另外一个类——InheritableThreadLocal。

使用起来很简单,在主线程的InheritableThreadLocal实例设置值,在子线程中就可以拿到了。

public class InheritableThreadLocalTest {
    
    public static void main(string[] args) {
        final ThreadLocal threadLocal = new InheritableThreadLocal();
        // 主线程
        threadLocal.set("main");
        //子线程
        Thread t = new Thread() {
            @Override
            public void run() {
                super.run();
                System.out.println("主线程数据:" + threadLocal.get());
            }
        };
        t.start();
    }
}

那原理是什么呢?

原理很简单,在Thread类里还有另外一个变量

ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;

在Thread.init的时候,如果父线程的inheritableThreadLocals不为空,就把它赋给当前线程(子线程)的inheritableThreadLocals。

if (inheritThreadLocals && parent.inheritableThreadLocals != null)
            this.inheritableThreadLocals =
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);