ThreadLocalUtils
1: Map版
package com.ciicsh.spring.boot.starter.core.util.excel.utils; import java.util.HashMap; import java.util.Map; import java.util.Objects; public class ThreadLocalUtils { private static ThreadLocal<Map<Object, Object>> RESOURCES; // 子线程可继承的ThreadLocal public static void initInhert() { removeResources(); RESOURCES = new InheritableThreadLocal(); RESOURCES.set(new HashMap<>()); } public static void withInitial() { removeResources(); RESOURCES = ThreadLocal.withInitial(() -> new HashMap<>()); } public static void removeResources() { if (Objects.nonNull(RESOURCES)) { RESOURCES.remove(); } } public static Map<Object, Object> getResources() { return Objects.isNull(RESOURCES) ? null : RESOURCES.get(); } public static void put(Object key, Object value) { Objects.requireNonNull(key, "key cannot be null"); Objects.requireNonNull(getResources(), "RESOURCES have not been inited"); getResources().put(key, value); } public static Object get(Object key) { return Objects.isNull(getResources()) ? null : getResources().get(key); } public static Object remove(Object key) { return Objects.isNull(getResources()) ? null : getResources().remove(key); } }
测试:
public static void main(String[] args) throws Exception { Map<Object, Object> resources = ThreadLocalUtils.initInhert().getResources(); resources.put("111","aaa"); System.out.println(ThreadLocalUtils.getResources());// {111=aaa} resources.put("222","bbb"); System.out.println(ThreadLocalUtils.getResources());// {111=aaa, 222=bbb} Thread t = new Thread(() -> { Map<Object, Object> resourcesChild = ThreadLocalUtils.getResources(); resourcesChild.put("333","ccc"); System.out.println(ThreadLocalUtils.getResources());// {111=aaa, 222=bbb, 333=ccc} }); t.start(); Thread.sleep(2000L); System.out.println(ThreadLocalUtils.getResources());// {111=aaa, 222=bbb, 333=ccc} }