Java web

线程变量ThreadLocal

2021-03-30  本文已影响0人  任未然

一. 概述

在多线程发开中, 有时候我们会需要用到一个针对当前线程的变量, 这时候ThreadLocal就派上用场了, ThreadLocal可以给当前线程设一个唯一的标识, 也可以对当前线程设置或获取一个变量

二. 工具类

public class ThreadLocalUtil<T> {
    private static ThreadLocal<String> threadLocalOnlyFlag = ThreadLocal.withInitial(() -> UUID.randomUUID().toString());

    private static ThreadLocal tThreadLocal = new ThreadLocal();
    /**
     * 获取当前线程唯一标识
     * @return
     */
    public static String getThreadOnlyFlag(){
        return threadLocalOnlyFlag.get();
    }

    /**
     * 设置当前线程变量
     * @param tClass
     * @param <T>
     * @return
     */
    public static <T> T get(Class<T> tClass){
        return (T)tThreadLocal.get();
    }

    /**
     * 获取当前线程变量
     * @param t
     * @param <T>
     */
    public static <T> void set(T t){
        tThreadLocal.set(t);
    }

    /**
     * 清除线程变量
     */
    public static void clear() {
        tThreadLocal.remove();
    }
}

三. 测试

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println("线程一:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
            ThreadLocalUtil.set(new User().setUsername("username1"));
            System.out.println("线程一:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
        }).start();

        new Thread(() -> {
            System.out.println("线程二:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
            ThreadLocalUtil.set(new User().setUsername("username2"));
            System.out.println("线程二:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
        }).start();

        new Thread(() -> {
            System.out.println("线程三:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
            ThreadLocalUtil.set(new User().setUsername("username3"));
            System.out.println("线程三:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
        }).start();

        new Thread(() -> {
            System.out.println("线程四:唯一key=>"+ThreadLocalUtil.getThreadOnlyFlag());
            ThreadLocalUtil.set(new User().setUsername("username4"));
            System.out.println("线程四:变量=>"+ThreadLocalUtil.get(User.class).getUsername());
        }).start();
    }

打印

线程二:唯一key=>556c92dd-09d6-4e74-9990-b9a207d6ac37
线程三:唯一key=>14a350ae-c614-45d8-92b1-067ee925cc19
线程四:唯一key=>4813472f-c5a5-4371-999f-10fc7c172ddd
线程一:唯一key=>1ff64a1f-0b24-4086-b61a-afaa41292940
线程三:变量=>username3
线程二:变量=>username2
线程四:变量=>username4
线程一:变量=>username1
上一篇 下一篇

猜你喜欢

热点阅读