【发布时间】:2012-10-17 10:30:31
【问题描述】:
嘿,我想实现一个 Java Servlet,它只为每个用户启动一次线程。即使刷新它也不应该重新开始。我的最后一种方法给我带来了一些麻烦,所以没有代码^^。对servlet的布局有什么建议吗?
public class LoaderServlet extends HttpServlet {
// The thread to load the needed information
private LoaderThread loader;
// The last.fm account
private String lfmaccount;
public LoaderServlet() {
super();
lfmaccount = "";
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
if (loader != null) {
response.setContentType("text/plain");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
out.write(loader.getStatus());
out.flush();
out.close();
} else {
loader = new LoaderThread(lfmaccount);
loader.start();
request.getRequestDispatcher("WEB-INF/pages/loader.jsp").forward(
request, response);
}
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
if (lfmaccount.isEmpty()) {
lfmaccount = request.getSession().getAttribute("lfmUser")
.toString();
}
request.getRequestDispatcher("WEB-INF/pages/loader.jsp").forward(
request, response);
}
}
jsp 使用 ajax 定期发布到 servlet 并获取状态。线程只运行了 3 分钟,爬取了一些 last.fm 数据。
【问题讨论】:
-
你能贴出你尝试过的代码吗?
-
你最后的方法是什么?给出一些细节/代码sn-ps。只有这样我们才能告诉你如何改进它。
-
为什么要为每个用户创建一个线程?我认为这种方法不可扩展,因为这意味着如果您有 1000 个用户,那么您需要 1000 个线程(每个线程都有自己的堆栈,这很可能会破坏您的内存)。
-
如果您更准确地告诉我们目的,也许我们可以建议一种不同的、希望更好的方法来做您想做的事。在 Java EE 世界中,将线程锁定给用户的基本想法对我来说似乎很不寻常。通常最好让容器管理线程并避免处理它们。
-
所以我有在我的网站上注册的用户。注册后,我必须从他们的帐户中抓取一些 lastfm 数据。所以没什么大不了的。我想避免的是他们在浏览器中按下刷新,然后触发新线程^^,当然让多个用户同时抓取他们的东西。
标签: java multithreading servlets multi-user