我正在编写一个servlet,它必须在init()
中启动一个线程,并在服务器停止后正确停止它。线程下载一个网页,解析它并将数据存储在MySQL数据库中。
为了停止线程,我使用servlet的destroy()
方法。在这个方法中,我设置条件来结束我的线程。这是正确的做法吗?
我可以在Windows的某个地方看到我的线程存在的迹象吗?我没有在Windows任务管理器中找到它。
答案 0 :(得分:3)
Windows任务管理器仅显示进程,而不是单个线程。事实上,JVM管理的线程属于用户线程类别,这是与内核线程(由操作系统管理)不同的类别。
要执行您想要的操作,您必须对Thread
对象保持全局引用,以便在不同方法中可见。最好让你的线程旋转一个标志并通过设置标志来停止它,而不是像Thread.stop()
那样使用它。像这样:
class ThreadTask implements Runnable {
private volatile boolean flag = false;
public void setFlag(boolean value) {
flag = value;
}
public void run() {
while(!flag) {
// execute code
}
}
}
通过拨打setFlag(true)
来停止它。
答案 1 :(得分:2)
不,你在Windows中看不到它们 - 你看到那里的进程,而不是线程。线程是jvm进程的内部线程。
您可以在visualvm中看到线程(也包含在JDK / bin / jvisualvm中)。只需连接到您的tomcat并查看线程。
destroy()
方法是一个不错的选择。但请致电thread.interrupt()
。
更好的方法是使用Java 5 executors framework。您创建一个执行程序,并向其提交Runnable
。在destroy()
,您只需致电executor.shutdown()