如何终止线程当Jsp页面关闭,称之为JSP?

时间:2012-01-18 09:35:53

标签: java multithreading jsp

我在JSP页面中调用一个线程,该线程继续运行。我希望在关闭JSP页面时终止此线程。哇那可能吗?

我的代码将它放在body标签JSP中:

<%
Thread Ping=new PingThread();
Ping.Start();
%>

先谢谢

5 个答案:

答案 0 :(得分:6)

你的意思是当用户关闭窗户时将其关闭?没有事件被解雇,所以你不能这样做。您可以通过JavaScript在用户关闭窗口时进行Ajax调用来实现,但无论如何它可能无法正常工作。

我想到的疑问是:为什么你会在JSP页面中启动这样一个可怕的事情?通过垃圾邮件F5按钮,有人可以获得历史上最简单的DOS攻击!重新考虑你的应用程序以避免这样的解决方案(根据请求盲目地启动线程,而不仅仅是你从JSP中执行它)。

答案 1 :(得分:3)

如果从JSP启动一个线程,则无法保证在用户退出页面时该线程将被停止。

  • 当用户关闭或离开普通HTML页面时,不会从客户端向服务器发送通知。无论如何。

  • 当用户关闭窗口或移动到其他页面时,您可以在网页中包含一些javascript来执行对服务器的AJAX调用。但是,有些情况下不会打电话; e.g。

    • 用户的机器死亡,

    • 用户的浏览器崩溃,

    • 用户已关闭javascript,

    • 用户在代码中设置断点,

    • 等等。

    即使拨打电话,也不能保证它不会因为一些短暂的网络问题而丢失。

最终结果是你的服务器有一个孤立的线程,它将继续做它正在做的事情(在这种情况下,用ICMP数据包敲击其他一些机器)直到你杀死你的web容器。

这是一个非常非常糟糕的主意。

答案 2 :(得分:0)

您可以使用Javascript beforeunloadunload事件来确定窗口正在关闭,但您使用的是哪一个,以及具体取决于您想要做什么。

答案 3 :(得分:0)

作为Anthony Grist's answer says(有点),您可以在浏览器检测到当前浏览器窗口关闭时,在您的网页中嵌入javascript。有关DOM Events及其处理的详细信息,请参阅此页。

注意:

  • 无论页面是否为JSP,这些东西都有效。 (例如......如果页面是纯HTML,它会起作用...只要服务器端有东西来处理通知。)

  • 此事件处理在用户网络浏览器中执行

  • 除非事件处理程序向服务器发送(AJAX)请求,否则服务器端不会被告知关闭窗口。

  • 正如我在回答上一个问题时所说,用户可以在客户端禁用事件处理。

  • 正如我在回答上一个问题时所说的那样,无法保证AJAX请求会实际回复到服务器。

  • 所有这些加起来就是窗口关闭事件的任何服务器端处理都是不可靠。并没有解决方案。不是在理论上,也不是在实践中。

答案 4 :(得分:-1)

你可以将上面的内容包含在另一个循环中,该循环由jsp页面通过ajax调用不时地设置为true。如果jsp页面没有将值设置为true,那么您可以放心地假设浏览器已关闭。但是你需要一个你的线程的标识符,例如会话id或用户的ip。