父子线程如何共享数据?

使用InheritableThreadLocal类

InheritableThreadLocal

public class InheritableThreadLocalTest {
public static void main(String[] args) {
final ThreadLocal threadLocal = new InheritableThreadLocal();
//主线程
threadLocal.set(“不擅技术”);
//子线程
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);

使用注意事项

1.变量的传递是发生在线程创建的时候,如果不是新建线程,而是用了线程池里的线程,就不灵了
2.变量的赋值就是从主线程的map复制到子线程,它们的value是同一个对象,如果这个对象本身不是线程安全的,那么就会有线程安全问题

你可能感兴趣的:(#,java并发,java)