在進行多線程編程時,咱們常常須要線程池子線程和父線程進行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