首页 > 编程语言 > 详细

使用ThreadLocal创建线程上下文

时间:2020-12-19 23:46:11      阅读:85      评论:0      收藏:0      [点我收藏+]

1 定义上下文接口

public interface ThreadContext {

    /**
     * 添加属性
     * 
     * @param key
     * @param object
     */
    void add(String key, Object object);

    /**
     * 获得属性
     * 
     * @param key
     * @return
     */
    Object get(String key);

}

2 定义上下文实现类

public class TaskThreadContext implements ThreadContext {

    /** 订单id */
    private int orderId;

    /** 任务开始执行时间 */
    private long startTime;

    /** task context map */
    public static Map<String, Object> taskContextMap = new HashMap<>();

    /**
     * 添加
     *
     * @param key
     * @param object
     */
    @Override
    public void add(String key, Object object) {
        if (null == taskContextMap) {
            taskContextMap = new HashMap<String, Object>();
        }
        taskContextMap.put(key, object);
    }

    @Override
    public Object get(String key) {
        if (null == taskContextMap) {
            taskContextMap = new HashMap<String, Object>();
        }
        return taskContextMap.get(key);
    }

    public int getOrderId() {
        return orderId;
    }

    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }

    public long getStartTime() {
        return startTime;
    }

    public void setStartTime(long startTime) {
        this.startTime = startTime;
    }
}

3 定义ThreadContext持有类

public class TaskContextHolder {

    /** task context threadLocal */
    private static final ThreadLocal<ThreadContext> TASK_CONTEXT = new ThreadLocal<>();

    public static ThreadContext getTaskContext() {
        if (TASK_CONTEXT.get() == null) {
            TASK_CONTEXT.set(new TaskThreadContext());
        }
        return TASK_CONTEXT.get();
    }

    public static void setTaskContext(ThreadContext taskContext) {
        TASK_CONTEXT.set(taskContext);
    }

    public static void add(String key, Object param) {
        getTaskContext().add(key, param);
    }

    public static Object get(String key) {
        return getTaskContext().get(key);
    }
}

4 测试

public class Test {
    public static void main(String[] args) {
        // 创建线程t1
        Thread thread = new Thread(() -> {
            // 添加上下文
            TaskThreadContext context = new TaskThreadContext();
            context.setOrderId(1);
            TaskContextHolder.setTaskContext(context);
            // 添加普通属性
            TaskContextHolder.add("t1", "Hello t1");

            TaskThreadContext taskContext = (TaskThreadContext) TaskContextHolder.getTaskContext();
            System.out.println("t1 order id:" + taskContext.getOrderId());
            System.out.println("t1:" + TaskContextHolder.get("t1"));
        }, "t1");
        thread.start();

        // 创建线程t2
        Thread thread2 = new Thread(() -> {
            // 添加上下文
            TaskThreadContext context = new TaskThreadContext();
            context.setOrderId(2);
            TaskContextHolder.setTaskContext(context);
            // 添加普通属性
            TaskContextHolder.add("t2", "Hello t2");

            TaskThreadContext taskContext = (TaskThreadContext) TaskContextHolder.getTaskContext();
            System.out.println("t2 order id:" + taskContext.getOrderId());
            System.out.println("t2:" + TaskContextHolder.get("t2"));
        }, "t2");
        thread2.start();
    }
}

结果:

t1 order id:1
t1:Hello t1
t2 order id:2
t2:Hello t2

使用ThreadLocal创建线程上下文

原文:https://www.cnblogs.com/yeyangshu/p/14161327.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!