• ThreadLocal学习Demo


    使用ThreadLocal就实现了多线程里的单线程。。ThreadLocal<MyThreadEntity2>  threadLocal = new ThreadLocal<>();  MyThreadEntity2 entity = threadLocal.get();  entity 中存放的是单个线程整个生命周期都可以共享的数据。实现了多个线程时单个线程的数据隔离,每个线程都会有自己的ThreadLocal<T>  对象,存放自己的数据。

    package com.thc.utils;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author 田海超
     * @E-mail  tianhaichao@sinosoft.com.cn
     * @date 2019年3月19日 上午10:32:37  
     * @Description 单个线程整个声明周期的共享参数
     */
    public class ThreadLocalUtils2 {
        // MyThreadEntity 这个是自己创建的类,里面可以设置你要存储在该线程中的变量(里面封装了你要放在单个线程整个生命周期都要共享的参数)
        private final static ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>();
    
        /**
         * @author 田海超
         * @date 2019年3月19日
         * @return description :通过threadLoal获得我们自己创建的MyThreadEntity的实例(第一次创建)
         */
        public static MyThreadEntity2 getMyThreadEntity() {
            MyThreadEntity2 entity = threadLocal.get();
            if (entity == null) {
                entity = new MyThreadEntity2();
                threadLocal.set(entity);
            }
            return entity;
        }
    
        /**
         * @author 田海超
         * @date 2019年3月19日 description :创建目的:【清空当前线程内对象】
         */
        public static void remove() {
            threadLocal.remove();
        }
    
        /**
         * <li>创建人:xiepan</li>
         * <li>创建时间:2018年5月3日</li>
         * <li>创建目的:【获取当前MyThreadEntity中的Map】</li>
         */
        public static Map<String, String> getThreadMap() {
            Map<String, String> map = getMyThreadEntity().getMap();
            if (map == null) {
                map = new HashMap<>();
                getMyThreadEntity().setMap(map);
            }
            return map;
        }
    
        /**
         * @author 田海超
         * @date 2019年3月19日
         * @param key
         * @param value
         *            description :创建目的:【当前线程内添加key值】
         */
        public static void put(String key, String value) {
            getThreadMap().put(key, value);
        }
    
        /**
         * @author 田海超
         * @date 2019年3月19日
         * @param key
         * @return description :创建目的:【当前线程内获取value值】
         */
        public static String get(String key) {
            return getThreadMap().get(key);
        }
    
        public static void main(String[] args) {
            // 使用时,先往线程实例中放值
            ThreadLocalUtils2.getMyThreadEntity().setPlanId("1033");
            ThreadLocalUtils2.getThreadMap().put("aa", "test");
            // 然后在需要用的时候取值
            ThreadLocalUtils2.getMyThreadEntity().getPlanId();
            ThreadLocalUtils2.getThreadMap().get("aa");
        }
        
    }
    class MyThreadEntity{
        private Map<String, String> map;
        private List<?> list;
        private Date date = new Date();
        private String planId;
    
        public String getPlanId() {
            return planId;
        }
    
        public void setPlanId(String planId) {
            this.planId = planId;
        }
    
        public Map<String, String> getMap() {
            return map;
        }
    
        public void setMap(Map<String, String> map) {
            this.map = map;
        }
    
        public List<?> getList() {
            return list;
        }
    
        public void setList(List<?> list) {
            this.list = list;
        }
    
        public Date getDate() {
            return date;
        }
    
        public void setDate(Date date) {
            this.date = date;
        }
    }
    普通demo - ThreadLocalUtils2
    package com.sinosig.xb.crms.utils;
    
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author 田海超
     * @E-mail  tianhaichao@sinosoft.com.cn
     * @date 2019年3月19日 上午10:32:37  
     * @Description 单个线程整个声明周期的共享参数
     */
    public class ThreadLocalUtils3 {
        // MyThreadEntity 这个是自己创建的类,里面可以设置你要存储在该线程中的变量(里面封装了你要放在单个线程整个生命周期都要共享的参数)
        private final static ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>();
    
        /**
         * @author 田海超
         * @date 2019年3月19日
         * @return description :通过threadLoal获得我们自己创建的MyThreadEntity的实例(第一次创建)
         */
        public static MyThreadEntity2 getMyThreadEntity() {
            MyThreadEntity2 entity = threadLocal.get();
            if (entity == null) {
                entity = new MyThreadEntity2() {
                    private Map<String, String> map;
                    private List<?> list;
                    private Date date = new Date();
                    private String planId;
    
                    public String getPlanId() {
                        return planId;
                    }
    
                    public void setPlanId(String planId) {
                        this.planId = planId;
                    }
    
                    public Map<String, String> getMap() {
                        return map;
                    }
    
                    public void setMap(Map<String, String> map) {
                        this.map = map;
                    }
    
                    public List<?> getList() {
                        return list;
                    }
    
                    public void setList(List<?> list) {
                        this.list = list;
                    }
    
                    public Date getDate() {
                        return date;
                    }
    
                    public void setDate(Date date) {
                        this.date = date;
                    }
                };
                threadLocal.set(entity);
            }
            return entity;
        }
    
        /**
         * @author 田海超
         * @date 2019年3月19日 description :创建目的:【清空当前线程内对象】
         */
        public static void remove() {
            threadLocal.remove();
        }
    
        /**
         * <li>创建人:xiepan</li>
         * <li>创建时间:2018年5月3日</li>
         * <li>创建目的:【获取当前线程ConcurrentHashMap】</li>
         */
        public static Map<String, String> getThreadMap() {
            Map<String, String> map = getMyThreadEntity().getMap();
            if (map == null) {
                map = new HashMap<>();
                getMyThreadEntity().setMap(map);
            }
            return map;
        }
    
        /**
         * @author 田海超
         * @date 2019年3月19日
         * @param key
         * @param value
         *            description :创建目的:【当前线程内添加key值】
         */
        public static void put(String key, String value) {
            getThreadMap().put(key, value);
        }
    
        /**
         * @author 田海超
         * @date 2019年3月19日
         * @param key
         * @return description :创建目的:【当前线程内获取value值】
         */
        public static String get(String key) {
            return getThreadMap().get(key);
        }
    
        public static void main(String[] args) {
            // 使用时,先往线程实例中放值
            ThreadLocalUtils3.getMyThreadEntity().setPlanId("1033");
            ThreadLocalUtils3.getThreadMap().put("aa", "test");
            // 然后在需要用的时候取值
            ThreadLocalUtils3.getMyThreadEntity().getPlanId();
            ThreadLocalUtils3.getThreadMap().get("aa");
        }
    }
    使用内部类的demo - ThreadLocalUtils3

    方法里使用内部类:

    ThreadLocalUtils3中getThreadMap方法的注解是错的。真正的ConcurrentHashMap是这样的:

    参考博文:https://www.cnblogs.com/ITtangtang/p/3948786.html

     

    参考博文:https://blog.csdn.net/qq_38663729/article/details/80058980

  • 相关阅读:
    XenServer 7 上Linux单用户模式下修改密码
    python pysnmp使用
    处理一则MySQL Slave环境出现ERROR 1201 (HY000): Could not initialize master info structure的案例。
    H3C交换机端口聚合
    H3C交换机密码策略
    使用Chrome远程调试GenyMotion上的WebView程序
    CefGlue在WinXP下闪退的排查方法
    Visual Studio 2015 开发Android Cordova出现unsupported major minor version 52.0错误的解决方法
    股票涨跌预测器
    javascript模块化编程-详解立即执行函数表达式IIFE
  • 原文地址:https://www.cnblogs.com/tianhaichao/p/10557590.html
Copyright © 2020-2023  润新知