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}
    }

 

posted @ 2020-03-06 13:53  Bevis  阅读(1455)  评论(0编辑  收藏  举报