システムスレッドとユーザースレッドでThreadLocalを共有したい場合にはInheritableThreadLocalを使用する

ThreadLocalの場合

public class Sample {
    public static void main(String[] args) throws Exception {
        final ThreadLocal tl = new ThreadLocal();
        tl.set(new String("hoge"));

        Thread t = new Thread() {
            public void run() {
                //共有されないのでnullが表示される
                System.out.println((String)tl.get());
            }
        };
        t.start();
    }
}

ThreadLocalだと共有されないのでThreadLocal#getはnullが返る

InheritableThreadLocalの場合

public class Sample {
    public static void main(String[] args) throws Exception {
        final InheritableThreadLocal tl = new InheritableThreadLocal();
        tl.set(new String("hoge"));

        Thread t = new Thread() {
            public void run() {
                //hogeが表示される
                System.out.println((String)tl.get());
            }
        };
        t.start();
    }
}