1. 程式人生 > >TransmittableThreadLocal 解決 執行緒池執行緒複用 無法複製 InheritableThreadLocal 的問題.

TransmittableThreadLocal 解決 執行緒池執行緒複用 無法複製 InheritableThreadLocal 的問題.

原理 https://blog.csdn.net/a837199685/article/details/52712547

例子https://www.cnblogs.com/sweetchildomine/p/8807059.html

public class Test {

    static ExecutorService executorService = Executors.newFixedThreadPool(1);

    public static void main(String[] args) {
        //子執行緒每次new 所以會複製執行緒的InheritableThreadLocal,結果正確
// withoutThreadPool(10);//true //因執行緒池複用執行緒,不會每次new 所以不會更新父執行緒InheritableThreadLocal 的值,導致結果錯誤 withThreadPool(10);//true or false } public static void withoutThreadPool(int c){ for(int i=0;i<c;i++){ Integer var1 = (int)(Math.random()*100); Integer var2 = (int
)(Math.random()*100); MyContextHolder.set(var1); threadRun(var1,var2); } } public static void withThreadPool(int c){ for(int i=0;i<c;i++){ Integer var1 = (int)(Math.random()*100); Integer var2 = (int)(Math.random()*100);
MyContextHolder.set(var1); threadPoolExecute(var1,var2); } } public static void threadRun(Integer var1,Integer var2){ new Thread(()->assert1(var1,var2)).start(); } public static void threadPoolExecute(Integer var1,Integer var2){ // executorService.execute(()->assert1(var1,var2)); executorService.execute(TtlRunnable.get(()->assert1(var1,var2)) ); } public static void assert1(Integer var1,Integer var2){ System.out.println(MyContextHolder.get()*var2==var1*var2); } public static class MyContextHolder{ // private static ThreadLocal<Integer> stringThreadLocal = new InheritableThreadLocal<>(); private static ThreadLocal<Integer> stringThreadLocal = new TransmittableThreadLocal<>(); public static void set(Integer data) { stringThreadLocal.set(data); } public static Integer get() { return stringThreadLocal.get(); } } }