以下分三种情况,直接上代码
import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.threadpool.TtlExecutors; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.Executor; /** * 测试子线程使用父线程变量 * * * * */ public class InheritableThreadLocalDemo { public static void main(String[] args) { // InheritableThreadLocalDemo.test1(); // InheritableThreadLocalDemo.test2(); InheritableThreadLocalDemo.test3(); } /*** * 使用传统threadlocal 无法传递threadlocal变量 */ public static void test1(){ ThreadLocal<String> local = new ThreadLocal<>(); ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor(); threadPool.initialize(); Executor executor = threadPool.getThreadPoolExecutor(); local.set("parent main"); Thread worker = new Thread(new Runnable() { @Override public void run() { System.out.println(local.get()); } }); executor.execute(worker); executor.execute(worker); local.set("parent main has changed"); executor.execute(worker); } /** * 使用transmittedThreadLocal 传递 , 可以传递了,但无法修改 threadlocal中的值 * */ public static void test2(){ ThreadLocal<String> local = new TransmittableThreadLocal<>(); ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor(); threadPool.initialize(); Executor executor = threadPool.getThreadPoolExecutor(); local.set("parent main"); Thread worker = new Thread(new Runnable() { @Override public void run() { System.out.println(local.get()); } }); executor.execute(worker); executor.execute(worker); local.set("parent main has changed"); executor.execute(worker); } /** * 使用transmittedThreadLocal ,并且使用封装的executor * 结论,既能传递又能修改 * */ public static void test3(){ ThreadLocal<String> local = new TransmittableThreadLocal<>(); ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor(); threadPool.initialize(); Executor executor = TtlExecutors.getTtlExecutor(threadPool); local.set("parent main"); Thread worker = new Thread(new Runnable() { @Override public void run() { System.out.println(local.get()); } }); executor.execute(worker); executor.execute(worker); local.set("parent main has changed"); executor.execute(worker); } }