A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

优雅的使用 ThreadLocal

维持线程封闭性的一种更规范的方法就是使用 ThreadLocal,这个类能使线程中的某个值与保存的值的对象关联起来。ThreadLocal提供 get和 set等接口或方法,这些方法为每一个使用这个变量的线程都存有一份独立的副本,因此 get总是返回由当前线程在调用 set时设置的最新值。ThreadLocal有如下方法  

1、get()方法是用来获取ThreadLocal在当前线程中保存的变量副本
2、set()用来设置当前线程中变量的副本
3、remove()用来移除当前线程中变量的副本
4、initialValue()是一个protected方法,一般是用来在使用时进行重写的,如果在没有set的时候就调用 get,会调用 initialValue方法初始化内容。为了使用的更放心,我们简单的
首先准备一个 BaseSigntureRequest类用来存放公共参数
  1. public class BaseSignatureRequest {
  2.     private String device;

  3.     public String getDevice() {
  4.         return device;
  5.     }

  6.     public void setDevice(String device) {
  7.         this.device = device;
  8.     }
  9. }

复制代码
  1. public class ThreadLocalCache {
  2.     public static ThreadLocal<BaseSignatureRequest>
  3.         baseSignatureRequestThreadLocal = new ThreadLocal<>();
  4. }

复制代码
      然后编写一个 Interceptor,在请求的时候获取 device参数,存入当前线程的 ThreadLocal中。这里需要注意的是,重写了 afterCompletion方法,当请求结束的时候把 ThreadLocalremove,移除不必须要键值对。  
  1. public class ParameterInterceptor implements HandlerInterceptor {
  2.             @Override
  3.             public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
  4.                                      Object handler) throws Exception {
  5.                 String device = request.getParameter("device");
  6.                 BaseSignatureRequest baseSignatureRequest = new BaseSignatureRequest();
  7.                 baseSignatureRequest.setDevice(device);
  8.         ThreadLocalCache.baseSignatureRequestThreadLocal.set(baseSignatureRequest);
  9.                 return true;
  10.             }
  11.        
  12.     @Override
  13.             public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
  14.                                         Object handler, Exception ex) throws Exception {
  15.                 ThreadLocalCache.baseSignatureRequestThreadLocal.remove();
  16.     }               
  17.     @Override
  18.             public void postHandle(HttpServletRequest httpServletRequest,
  19.                                    HttpServletResponse httpServletResponse,                                   Object o, ModelAndView modelAndView) throws Exception {
  20.        
  21.             }
  22.         }

复制代码





1 个回复

倒序浏览
一般使用哪个线程池
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马