JAVA 线程基本知识汇总--ThreadLocal 和 InheritableThreadLoc

1package org.test; 2 3public class ThreadLocalTest { 4 public static void main(String[] args) { 5 User user = new User(new ThreadLocal<String>()); 6 Book book = new Book(); 7 Thread t1 = new Thread(new UnSafeRunnable(user, "pat", book)); 8 Thread t2 = new Thread(new UnSafeRunnable(user, "zhenglong", book)); 9 t1.start(); 10 t2.start(); 11 } 12} 13 14class Book { 15 private String name; 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25} 26 27class User { 28 private ThreadLocal<String> name; 29 30 public User(ThreadLocal<String> name) { 31 this.name = name; 32 } 33 34 public String getName() { 35 return name.get(); 36 } 37 38 public void setName(String names) { 39 name.set(names); 40 } 41 42} 43 44class UnSafeRunnable implements Runnable { 45 private User user; 46 private String name; 47 private Book book; 48 49 public UnSafeRunnable(User user, String name, Book book) { 50 this.user = user; 51 this.name = name; 52 this.book = book; 53 } 54 55 @Override 56 public void run() { 57 user.setName(name); 58 book.setName(name); 59 try { 60 Thread.sleep(1000); 61 } catch (InterruptedException e) { 62 Thread.currentThread().interrupt(); 63 } 64 System.err.println(user.getName() + "user"); 65 System.err.println(book.getName() + "book"); 66 } 67}

    我的工具类: 在拦截起中间 将属性保存到ThreadLocal中间去,确保在单个线程中间的全部流程中都可以获取到我们复制的属性 这也是ThreadLocal的最大的用途

1package com.chelement.core.common; 2 3import com.chelement.core.common.vo.ChannelUserTokenDetailVO; 4import com.chelement.core.common.vo.ChelementUserTokenDetailVO; 5import com.chelement.core.common.vo.CustomerTokenDetailVO; 6 7/** 8 * 权限工具类for 缓存 9 *  10 * @author pat 11 *  12 */ 13public class AccessControllerUtil { 14 15 private static ThreadLocal<ChannelUserTokenDetailVO> threadLocal_channel_user = new ThreadLocal<ChannelUserTokenDetailVO>(); 16 17 private static ThreadLocal<ChelementUserTokenDetailVO> threadLocal_chelement_user = new ThreadLocal<ChelementUserTokenDetailVO>(); 18 19 private static ThreadLocal<CustomerTokenDetailVO> threadLocal_customer_user = new ThreadLocal<CustomerTokenDetailVO>(); 20 21 private AccessControllerUtil() { 22 } 23 24 public static ChannelUserTokenDetailVO getChannelUserDetailFromThreadLocal() { 25 return threadLocal_channel_user.get(); 26 } 27 28 public static void setChannelUserDetailFromThreadLocal(ChannelUserTokenDetailVO newValue) { 29 threadLocal_channel_user.set(newValue); 30 } 31 32 public static void removeChannelUserDetailFromThreadLocal() { 33 threadLocal_channel_user.remove(); 34 } 35 36 public static ChelementUserTokenDetailVO getChelementUserDetailFromThreadLocal() { 37 return threadLocal_chelement_user.get(); 38 } 39 40 public static void setChelementUserDetailFromThreadLocal(ChelementUserTokenDetailVO newValue) { 41 threadLocal_chelement_user.set(newValue); 42 } 43 44 public static void removeChelementUserDetailFromThreadLocal() { 45 threadLocal_chelement_user.remove(); 46 } 47 48 public static CustomerTokenDetailVO getCustomerDetailFromThreadLocal() { 49 return threadLocal_customer_user.get(); 50 } 51 52 public static void setCustomerDetailFromThreadLocal(CustomerTokenDetailVO newValue) { 53 threadLocal_customer_user.set(newValue); 54 } 55 56 public static void removeCustomerDetailFromThreadLocal() { 57 threadLocal_customer_user.remove(); 58 } 59} 60 61package com.chelement.core.common; 62 63import java.io.OutputStream; 64import java.io.OutputStreamWriter; 65import java.io.PrintWriter; 66import java.util.ArrayList; 67import java.util.List; 68 69import javax.servlet.http.HttpServletRequest; 70import javax.servlet.http.HttpServletResponse; 71 72import org.apache.commons.lang3.StringUtils; 73import org.springframework.beans.factory.annotation.Autowired; 74import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 75 76import com.alibaba.fastjson.JSON; 77import com.chelement.business.enums.permission.SysRoleEnum; 78import com.chelement.core.channelManagement.dal.domain.Channel; 79import com.chelement.core.channelManagement.dal.domain.ChannelUser; 80import com.chelement.core.channelManagement.service.ChannelService; 81import com.chelement.core.channelManagement.service.ChannelUserService; 82import com.chelement.core.common.vo.BaseTokenDetailVO; 83import com.chelement.core.common.vo.ChannelUserTokenDetailVO; 84import com.chelement.core.common.vo.ChelementUserTokenDetailVO; 85import com.chelement.core.common.vo.CustomerTokenDetailVO; 86import com.chelement.core.customerManagement.service.CustomerService; 87import com.chelement.core.exceptions.BizException; 88import com.chelement.core.houseManagement.dal.domain.Community; 89import com.chelement.core.houseManagement.service.CommunityService; 90import com.chelement.core.sysManagement.service.ChelementUserService; 91import com.chelement.core.utils.PermissionUtil; 92import com.chelement.core.web.common.ResultData; 93 94/** 95 *  96 * @author pat super 97 */ 98public class CoreAccessControllerFilter extends HandlerInterceptorAdapter { 99 100 @Autowired 101 private ChannelUserService channelUserService; 102 103 @Autowired 104 CustomerService customerService; 105 106 @Autowired 107 ChelementUserService chelementUserService; 108 109 @Autowired 110 CommunityService communityService; 111 112 @Autowired 113 ChannelService channelService; 114 115 @Override 116 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 117 String token = request.getHeader("token"); 118 if (StringUtils.isNotBlank(token)) { 119 String result = PermissionUtil.exiteToken(token); 120 if (result != null && result.equals("true")) { 121 String type = token.substring(0, 1); 122 BaseTokenDetailVO detailVO = PermissionUtil.getTokenDetailByToken(token); 123 String accountId = detailVO.getAccountId(); 124 switch (type) { 125 case "1": 126 ChannelUserTokenDetailVO channelUserTokenDetailVO = new ChannelUserTokenDetailVO(detailVO); 127 ChannelUser channelUser = channelUserService.selectChannelUserWithCommunityIds(accountId); 128 String channelId = channelUser.getChannelId(); 129 channelUserTokenDetailVO.setChannelId(channelId); 130 if (detailVO.getRoleName().equals(SysRoleEnum.经纪人.getValue())) { 131 List<String> communityIds = channelUser.getCommunityIds(); 132 channelUserTokenDetailVO.setCommunityIds(communityIds); 133 } else if (detailVO.getRoleName().equals(SysRoleEnum.管理员.getValue()) || detailVO.getRoleName().equals(SysRoleEnum.会计师.getValue())) { 134 Community queryCommunity = new Community(); 135 queryCommunity.setChannelId(channelId); 136 List<Community> communities = communityService.selectList(queryCommunity); 137 List<String> communityIds = new ArrayList<String>(); 138 for (Community community : communities) { 139 communityIds.add(community.getId()); 140 } 141 channelUserTokenDetailVO.setCommunityIds(communityIds); 142 } 143 AccessControllerUtil.setChannelUserDetailFromThreadLocal(channelUserTokenDetailVO); 144 break; 145 case "2": 146 CustomerTokenDetailVO customerTokenDetailVO = new CustomerTokenDetailVO(detailVO); 147 AccessControllerUtil.setCustomerDetailFromThreadLocal(customerTokenDetailVO); 148 break; 149 case "3": 150 ChelementUserTokenDetailVO chelementUserTokenDetailVO = new ChelementUserTokenDetailVO(detailVO); 151 Channel query = new Channel(); 152 query.setChelementUserId(accountId); 153 List<Channel> channels = channelService.selectList(query); 154 List<String> channelIds = new ArrayList<String>(); 155 for (Channel channel : channels) { 156 channelIds.add(channel.getId()); 157 } 158 chelementUserTokenDetailVO.setChannelIds(channelIds); 159 AccessControllerUtil.setChelementUserDetailFromThreadLocal(chelementUserTokenDetailVO); 160 break; 161 default: 162 throw new BizException("账户类型不存在!"); 163 } 164 return true; 165 } 166 ResultData data = getResultData(); 167 response.setCharacterEncoding("utf-8"); 168 response.setContentType("text/html;charset=UTF-8"); 169 OutputStream out = response.getOutputStream(); 170 PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, "utf-8")); 171 // 返回json格式的提示 172 pw.println(JSON.toJSON(data)); 173 pw.flush(); 174 pw.close(); 175 return false; 176 } 177 return false; 178 } 179 180 @Override 181 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 182 AccessControllerUtil.removeChannelUserDetailFromThreadLocal(); 183 } 184 185 private ResultData getResultData() { 186 ResultData data = new ResultData(); 187 data.setSuccess(false); 188 data.setDescription("Token 无效"); 189 return data; 190 } 191}

   至于

InheritableThreadLocal

则是将可见扩张到子类: 

1package org.test; 2 3public class ThreadLocalTest { 4 public static void main(String[] args) { 5 User user = new User(new ThreadLocal<String>(), 6 new InheritableThreadLocal<String>()); 7 Book book = new Book(); 8 Thread xx = new Thread(new SonUnsafeThread(new UnSafeRunnable(user, 9 "pat1", book))); 10 xx.start(); 11 } 12} 13 14class Book { 15 private String name; 16 17 public String getName() { 18 return name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25} 26 27class User { 28 private ThreadLocal<String> name; 29 30 private InheritableThreadLocal<String> test; 31 32 public User(ThreadLocal<String> name, InheritableThreadLocal<String> test) { 33 this.name = name; 34 this.test = test; 35 } 36 37 public String getName() { 38 return name.get(); 39 } 40 41 public void setName(String names) { 42 name.set(names); 43 } 44 45 public String getTest() { 46 return test.get(); 47 } 48 49 public void setTest(String names) { 50 test.set(names); 51 } 52 53} 54 55class UnSafeRunnable implements Runnable { 56 private User user; 57 private String name; 58 private Book book; 59 60 public UnSafeRunnable(User user, String name, Book book) { 61 this.user = user; 62 this.name = name; 63 this.book = book; 64 user.setName(name); 65 book.setName(name); 66 user.setTest(name); 67 } 68 69 @Override 70 public void run() { 71 72 try { 73 Thread.sleep(1000); 74 } catch (InterruptedException e) { 75 Thread.currentThread().interrupt(); 76 } 77 System.err.println(user.getTest() + "test"); 78 } 79 80 public User getUser() { 81 return user; 82 } 83 84 public void setUser(User user) { 85 this.user = user; 86 } 87 88 public String getName() { 89 return name; 90 } 91 92 public void setName(String name) { 93 this.name = name; 94 } 95 96 public Book getBook() { 97 return book; 98 } 99 100 public void setBook(Book book) { 101 this.book = book; 102 } 103 104} 105 106/** 107 *  108 * @author patzheng 597439394@163.com 109 * 110 */ 111class SonUnsafeThread implements Runnable { 112 private UnSafeRunnable thread; 113 114 public SonUnsafeThread(UnSafeRunnable thread) { 115 this.thread = thread; 116 } 117 118 @Override 119 public void run() { 120 System.err.println(thread.getUser()); 121 System.err.println(thread.getUser().getName() + "ThreadLocal"); 122 System.err.println(thread.getUser().getTest() + "sonThreadLocal"); 123 } 124}
点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java8 List集合的排序,求和,取最大值,按照条件过滤

public class Java8Test{public static void main(Stringargs){Personp1 new Person("麻子", 31);Personp2 new Person("

java8之lambda表达式(变量作用域)

通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如:package java8test;public class T1 {    public static void main(String args) {        repeatMessage("Hello", 20);

java递归算法+遍历磁盘文件

package com.cnse.io.ioDemo;import java.io.File;//java遍历磁盘下所有的文件 递归 recursionpublic class FlList {    public static void main(String args) {

java字符串比较和jdkequals源码分析

 package com.cnse.demo;/  比较两个字符串相等 /public class StringTest { public static void main(String args) {  int checkLength  0;  String str

Google Guava Striped 实现细粒度锁

首先不谈Striped能做什么,我们来看下如下的代码/   购买产品   @param user 用户   @param buyAmount 购买金额   @param productId 产品编号  / public static void buy(String user