我在用InheritableThreadLocal
in my Servlet
班级。这样它就可以从它的子线程中使用。这是邪恶的使用吗InheritableThreadLocal
在线程池执行器中? 。比如servlet线程池。
我的问题。
1)为什么我们应该避免使用InheritableThreadLocals
在 servlet 中?
2)内存泄漏是否可能发生在InheritableThreadLocal
?
3)有没有什么替代方案InheritableThreadLocal
?.
4)如果线程将被重用会发生什么,存储在threadlocal
不会被清除吗?
我的实时场景
public class UserAccessFilter implements javax.servlet.Filter {
static final InheritableThreadLocal<String> currentRequestURI = new InheritableThreadLocal<String>();
public void doFilter(ServletRequest req, ServletResponse resp , FilterChain fc) throws IOException, ServletException{
String uri = request.getRequestURI();
fc.doFilter(request, response);
}
}
public class MailServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String mailCount = req.getParameter("mailCount");
if(mailCount != null && !"".equals(mailCount) && mailCount.matches("[0-9]+")){
MailThread mailThread = new MailThread("[email protected] /cdn-cgi/l/email-protection", generateToAddress(Integer.parseInt(mailCount))); //NO I18N
Thread t = new Thread(mailThread);
t.start();
}
resp.getWriter().println("Mail Servlet.............."); //NO I18N
}
}
class MailThread implements Runnable{
private String from;
private String to;
public MailThread(String from , String to){
this.from = from;
this.to = to;
}
@Override
public void run() {
sendMail();
}
public void sendMail(){
//I want this uri from child threads. I can't pass this value to this constructor.
String uri = currentRequestURI.get();
//Do Mail Operations
}
}
过滤器 --> Servlet A --> 子线程 ---> 邮件线程(这里我获取过滤器中设置的值)。