说明
由于java子线程独立于主线程,无法共享主线程中的对象,一般需要通过构造函数的方式传递对象中来,request一般使用
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
实现过程
在线程外部获取到requestAttributes ,然后在在线程内部将requestAttributes 设置到RequestContextHolder中去
线程代码
public class OutPickingCallable implements Callable<Message> {
private RequestAttributes requestAttributes;
public OutPickingCallable(RequestAttributes requestAttributes) {
super();
this.requestAttributes = requestAttributes;
}
@Override
public Message call() throws Exception {
RequestContextHolder.setRequestAttributes(requestAttributes);
try {
dosomething...
return pickMsg;
} catch (Exception e) {
message.setSuccess(false);
return message;
}
}
}
调用代码
ExecutorService threadPool = Executors.newFixedThreadPool(10);
List<Callable<Message>> teaks = new ArrayList<Callable<Message>>();
List<Future<Message>> invokeAll = null;
SecurityContext sc = SecurityContextHolder.getContext();
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
for (int i=0 ; i<10;i++){
OutPickingCallable call = new OutPickingCallable(requestAttributes);
teaks.add(call);
}
invokeAll = threadPool.invokeAll(teaks);
// 千万不能忘记
threadPool.shutdown();
这样就可以在线程中实现对request中信息的使用