我在我的Servlet
类中使用了InheritableThreadLocal
。以便它可以从它的子线程中获得。在线程池执行程序中使用InheritableThreadLocal
是否是这种罪恶? 。比如servlet线程池。为什么我应该避免在servlet中使用InheritableThreadLocal?
我的问题。
1)为什么我们应该避免在servlets中使用InheritableThreadLocals?
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]", 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 - >子线程--->邮件线程(在这里我得到的过滤器设置好的值)。
我无法将requestURI传递给'MailThread'。在这里我发布示例场景。 – kannanrbk
为什么你可以将requestURI传递给'MailThread',在'doGet'方法中有'HttpServletRequest'? –
是的,但我不能限制发送请求的uri发送电子邮件。它可以被其他成员使用。 – kannanrbk