【多线程】ThreadLocal使用场景

首先了解ThreadLocal的意义以及作用:

https://blog.csdn.net/lufeng20/article/details/24314381

我在使用SSM开发项目的时候,对于异步请求,在控制器中是通过自定义一个AjaxResult工具类来去接受和传递数据给前端result的。并且对这段代码进行捕获。例如:

@ResponseBody
	@RequestMapping("/doAdd")
	public Object add(User user) {
			AjaxResult result = new AjaxResult();
			try {
				int count = userService.saveUser(user);
				result.setSuccess(true);
				result.setMessage("新增用户成功!");
			} catch(Exception e) {
				e.printStackTrace();
				result.setSuccess(false);
				result.setMessage("新增用户失败!");
			}
		    
			return result;
	}

导致每个异步请求的控制器模块代码冗余严重。

可以使用建立一个父类,让对应这些类去继承它。

同时注意,不能使用成员变量,因为控制器对象默认是单例的。会出现多线程并发问题,可以通过ThreadLocal来共享数据。

整个过程就是相当于定义一个Map集合,然后再把数据往里面放就可以了。避免多个方法调用这个集合造成了多线程问题,再把它放到ThreadLocal中。

import java.util.HashMap;
import java.util.Map;

public class BaseController {
	private ThreadLocal<Map<String,Object>> datas = new ThreadLocal<Map<String,Object>>();
	
	protected void start() {
		Map<String,Object> resultMap = new HashMap<String,Object>();
		datas.set(resultMap);
	}
	
	public Object end() {
		Map<String,Object> resultMap = datas.get();
		datas.remove();
		return resultMap;
	}
	
	public void success(boolean flg) {
		Map<String,Object> resultMap = datas.get();
		resultMap.put("success", flg);
	}
	
	public void param(String key,Object val) {
		Map<String,Object> resultMap = datas.get();
		resultMap.put(key, val);
	}
	
	public void error(String msg) {
		Map<String,Object> resultMap = datas.get();
		resultMap.put("error", msg);
	}
}
发布了103 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zzf_forgot/article/details/102695653
今日推荐