优雅的使用-ThreadLocal

12次阅读

共计 1810 个字符,预计需要花费 5 分钟才能阅读完成。

优雅的使用 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.         }
正文完
 0