zoukankan      html  css  js  c++  java
  • ThreadLocal实现线程级上下文

    一.ThreadLocal测试

     1 package com.junge.threadlocal.context;
     2 
     3 /**
     4  * @author Administrator
     5  * 
     6  */
     7 public class ThreadScopeData {
     8     private ThreadScopeData() {
     9 
    10     }
    11 
    12     private static ThreadLocal<ThreadScopeData> threadLocal = new ThreadLocal<ThreadScopeData>();
    13 
    14     public static ThreadScopeData getInstance() {
    15         if (null == threadLocal.get()) {
    16             threadLocal.set(new ThreadScopeData());
    17         }
    18 
    19         return threadLocal.get();
    20     }
    21 
    22     public static void main(String[] args) {
    23 
    24         new Thread(new Runnable() {
    25             @Override
    26             public void run() {
    27                 System.out.println(ThreadScopeData.getInstance());
    28 
    29             }
    30         }).start();
    31 
    32         new Thread(new Runnable() {
    33             @Override
    34             public void run() {
    35                 System.out.println(ThreadScopeData.getInstance());
    36 
    37             }
    38         }).start();
    39     }
    40 }

    二.对上下接口进行封装,使用方便(线程绑定不同的业务数据,线程之间的业务数据放在上下文中)

    1.上下文接口ThreadContext

    package com.junge.threadlocal.context;
    
    import java.util.Map;
    
    /**
     * 线程上下文接口
     * 
     * @author Administrator
     * 
     */
    public interface ThreadContext {
    
        /**
         * 保持用户名
         * 
         * @param userName
         */
        void setUserName(String userName);
    
        /**
         * 获取用户名
         * 
         * @return
         */
        String getUserName();
    
        /**
         * 保持参数1
         * 
         * @param param
         */
        void setParam1(Object param);
    
        /**
         * 获取参数1
         * 
         * @return
         */
        Object getParam1();
    
        /**
         * 添加参数
         * 
         * @param key
         * @param param
         */
        void addParam(String key, Object param);
    
        /**
         * 获取参数
         * 
         * @param key
         * @return
         */
        Object getParam(String key);
    
        /**
         * 获取所有添加的参数
         * 
         * @return
         */
        Map<String, Object> getAllParam();
    }

    2.线程上下文接口实现ThreadContextImpl

    package com.junge.threadlocal.context;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 线程上下文接口实现
     * 
     * @author Administrator
     * 
     */
    public class ThreadContextImpl implements ThreadContext {
    
        private String userName;
    
        private Object param1;
    
        private Map<String, Object> paramMap;
    
        @Override
        public void setUserName(String userName) {
            this.userName = userName;
    
        }
    
        @Override
        public String getUserName() {
    
            return this.userName;
        }
    
        @Override
        public void setParam1(Object param) {
            this.param1 = param;
    
        }
    
        @Override
        public Object getParam1() {
    
            return param1;
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see
         * com.junge.threadlocal.context.ThreadContext#addParam(java.lang.String,
         * java.lang.Object)
         */
        @Override
        public void addParam(String key, Object param) {
            if (null == paramMap) {
                paramMap = new HashMap<String, Object>();
            }
    
            paramMap.put(key, param);
    
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see
         * com.junge.threadlocal.context.ThreadContext#getParam(java.lang.String)
         */
        @Override
        public Object getParam(String key) {
            if (null == paramMap) {
                paramMap = new HashMap<String, Object>();
            }
            return paramMap.get(key);
        }
    
        /*
         * (non-Javadoc)
         * 
         * @see com.junge.threadlocal.context.ThreadContext#getAllParam()
         */
        @Override
        public Map<String, Object> getAllParam() {
            if (null == paramMap) {
                paramMap = new HashMap<String, Object>();
            }
            return paramMap;
        }
    
    }

    3.线程上下文助手ThreadContextHolder

     1 /**
     2  * 
     3  */
     4 package com.junge.threadlocal.context;
     5 
     6 import java.util.Map;
     7 
     8 /**
     9  * 线程上下文助手
    10  * 
    11  * @author Administrator
    12  * 
    13  */
    14 public class ThreadContextHolder {
    15 
    16     /**
    17      * 上下文保持对象
    18      */
    19     private static ThreadLocal<ThreadContext> threadContext = new ThreadLocal<ThreadContext>();
    20 
    21     public static void setThreadContext(ThreadContext context) {
    22         threadContext.set(context);
    23     }
    24 
    25     public static ThreadContext getThreadContext() {
    26         if (null == threadContext.get()) {
    27             threadContext.set(new ThreadContextImpl());
    28         }
    29         return threadContext.get();
    30     }
    31 
    32     public static void setUserName(String userName) {
    33         getThreadContext().setUserName(userName);
    34     }
    35 
    36     public static String getUserName() {
    37         return getThreadContext().getUserName();
    38     }
    39 
    40     public static void setParam1(Object param) {
    41         getThreadContext().setParam1(param);
    42     }
    43 
    44     public static Object getParam1() {
    45         return getThreadContext().getParam1();
    46     }
    47 
    48     public static void addParam(String key, Object param) {
    49         getThreadContext().addParam(key, param);
    50     }
    51 
    52     public static Object getParam(String key) {
    53         return getThreadContext().getParam(key);
    54     }
    55 
    56     public static Map<String, Object> getAllParam() {
    57         return getThreadContext().getAllParam();
    58     }
    59 
    60 }

    4.线程上下文测试代码
     1 package com.junge.threadlocal.context;
     2 
     3 public class ThreadContextHolderTest {
     4 
     5     /**
     6      * @param args
     7      */
     8     public static void main(String[] args) {
     9         new Thread(new Runnable() {
    10             @Override
    11             public void run() {
    12                 ThreadContextHolder.setUserName("userName1");
    13                 ThreadContextHolder.setParam1(new Object());
    14                 ThreadContextHolder.addParam("param1", "aaaa");
    15 
    16                 System.out.println(Thread.currentThread().getName() + ":"
    17                         + ThreadContextHolder.getUserName());
    18                 System.out.println(Thread.currentThread().getName() + ":"
    19                         + ThreadContextHolder.getParam1());
    20                 System.out.println(Thread.currentThread().getName() + ":"
    21                         + ThreadContextHolder.getParam("param1"));
    22 
    23             }
    24         }).start();
    25 
    26         new Thread(new Runnable() {
    27             @Override
    28             public void run() {
    29                 ThreadContextHolder.setUserName("userName2");
    30                 ThreadContextHolder.setParam1(new Object());
    31                 ThreadContextHolder.addParam("param1", "bbbb");
    32 
    33                 System.out.println(Thread.currentThread().getName() + ":"
    34                         + ThreadContextHolder.getUserName());
    35                 System.out.println(Thread.currentThread().getName() + ":"
    36                         + ThreadContextHolder.getParam1());
    37                 System.out.println(Thread.currentThread().getName() + ":"
    38                         + ThreadContextHolder.getParam("param1"));
    39 
    40             }
    41         }).start();
    42 
    43     }
    44 
    45 }
    运行结果:
    Thread-0:userName1
    Thread-0:java.lang.Object@6e1408
    Thread-0:aaaa
    Thread-1:userName2
    Thread-1:java.lang.Object@e53108
    Thread-1:bbbb


  • 相关阅读:
    Vue 目录
    【SVN】彻底 svn 服务器上的 删除某一个文件或文件夹
    【Linux】安装 PostgreSQL
    【Linux】安装 node.js
    在vue中使用echarts图表
    Grunt搭建自动化web前端开发环境--完整流程
    JavaScript 开发规范
    React设计思想
    js闭包的理解
    pytharm安装第三方库
  • 原文地址:https://www.cnblogs.com/junge8618/p/4253342.html
Copyright © 2011-2022 走看看