线程池的上下文的传递和设计模式

38 阅读1分钟

1.步骤

  1. 初步使用ThreadLoacl
  2. 初步使用MDC

-->得出阶段 这两个对象都和线程只自身上下文相关 3. ThreadLoacl绑定Map类,封装成一个统一的工具类 4. 传递父类的上下文到子类的Runnable或者Callable当中,完成测试

-->完成测试 5. 使用一个父线程池封装,每个任务的提交都会把当前执行线程的上下文传递到任务的执行周期当中

参考开源项目damai

com.damai.base.BaseThreadPool

/**
 * @author : zlx
 * description :
 * date : 2025-04-12
 **/
@Data
public class MDCThreadPool {

    public Runnable wrapperRunable(Runnable runnable, Map<String, String> map) {
        return () -> {
            try {
                BaseParameterHolder.setParameterMap(map);
                runnable.run();
            } finally {
                BaseParameterHolder.removeParameterMap();
            }
        };
    }


    @Test
    public void test1() throws InterruptedException {
        BaseParameterHolder.setParameter("key","value");

        BaseParameterHolder.setParameter("key2","value2");

        MDC.put("mdc key1","mdc value1");
        Runnable target = new Runnable() {
            @Override
            public void run() {
                String key = BaseParameterHolder.getParameter("key");
                System.out.println(key);
                String s = MDC.get("mdc key1");
                System.out.println(s);
            }
        };

        Runnable wrapperTarget = wrapperRunable(target,BaseParameterHolder.getParameterMap());
        new Thread(wrapperTarget).start();

        Thread.sleep(100);
        String key = BaseParameterHolder.getParameter("key");
        String key1 = MDC.get("mdc key1");
        System.out.println(key1);
        System.out.println(key);
    }

}
class BaseParameterHolder {

    private static final ThreadLocal<Map<String, String>> THREAD_LOCAL_MAP = new ThreadLocal<>();


    public static void setParameter(String name, String value) {
        Map<String, String> map = THREAD_LOCAL_MAP.get();
        if (map == null) {
            map = new HashMap<>(64);
        }
        map.put(name, value);
        THREAD_LOCAL_MAP.set(map);
    }

    public static String getParameter(String name) {
        return Optional.ofNullable(THREAD_LOCAL_MAP.get()).map(map -> map.get(name)).orElse(null);
    }

    public static void removeParameter(String name) {
        Map<String, String> map = THREAD_LOCAL_MAP.get();
        if (map != null) {
            map.remove(name);
        }
    }

    public static ThreadLocal<Map<String, String>> getThreadLocal() {
        return THREAD_LOCAL_MAP;
    }

    public static Map<String, String> getParameterMap() {
        Map<String, String> map = THREAD_LOCAL_MAP.get();
        if (map == null) {
            map = new HashMap<>(64);
        }
        return map;
    }

    public static void setParameterMap(Map<String, String> map) {
        THREAD_LOCAL_MAP.set(map);
    }

    public static void removeParameterMap(){
        THREAD_LOCAL_MAP.remove();
    }
}