在进行多线程编程时,咱们常常须要线程池子线程和父线程进行ThreadLocal信息传递,实现一些业务处理。编程
public class App { static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>(); public static void main(String[] args) { threadLocal.set(new Integer(123)); Thread thread = new SonThread(); thread.start(); System.out.println("main = " + threadLocal.get()); } static class SonThread extends Thread { @Override public void run() { System.out.println("SonThread = " + threadLocal.get()); } } }
main = 123 SonThread = null
static ThreadLocal<Integer> threadLocal = new InheritableThreadLocal<Integer>();
main = 123 SonThread = 123
经过InheritableThreadLocal咱们能够实现父子线程之间ThreadLocal信息传递。多线程
重写了getMap和createMap方法。ide
public class InheritableThreadLocal<T> extends ThreadLocal<T> { ThreadLocalMap getMap(Thread t) { return t.inheritableThreadLocals; } void createMap(Thread t, T firstValue) { t.inheritableThreadLocals = new ThreadLocalMap(this, firstValue); }
/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null; /* * InheritableThreadLocal values pertaining to this thread. This map is * maintained by the InheritableThreadLocal class. */ ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
因此说 整个 InheritableThreadLocal 的实现原理就是这样的。this
public static void main(String[] args) { threadLocal.set(new Integer(123)); ExecutorService fixPool = Executors.newFixedThreadPool(10); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 500); } catch (InterruptedException e) { e.printStackTrace(); } fixPool.execute(new Runnable() { public void run() { System.out.println("Thread = " + Thread.currentThread().getName() + ", SonThread = " + threadLocal.get()); } }); } fixPool.shutdown(); }
使用前:线程
Thread = pool-1-thread-1, SonThread = null Thread = pool-1-thread-2, SonThread = null Thread = pool-1-thread-3, SonThread = null Thread = pool-1-thread-4, SonThread = null Thread = pool-1-thread-5, SonThread = null Thread = pool-1-thread-6, SonThread = null Thread = pool-1-thread-7, SonThread = null Thread = pool-1-thread-8, SonThread = null Thread = pool-1-thread-9, SonThread = null Thread = pool-1-thread-10, SonThread = null
使用InheritableThreadLocal以后:code
Thread = pool-1-thread-1, SonThread = 123 Thread = pool-1-thread-2, SonThread = 123 Thread = pool-1-thread-3, SonThread = 123 Thread = pool-1-thread-4, SonThread = 123 Thread = pool-1-thread-5, SonThread = 123 Thread = pool-1-thread-6, SonThread = 123 Thread = pool-1-thread-7, SonThread = 123 Thread = pool-1-thread-8, SonThread = 123 Thread = pool-1-thread-9, SonThread = 123 Thread = pool-1-thread-10, SonThread = 123