如何在系统中找到我的主题?

时间:2012-01-16 22:26:46

标签: java multithreading servlets

我正在编写一个servlet,它必须在init()中启动一个线程,并在服务器停止后正确停止它。线程下载一个网页,解析它并将数据存储在MySQL数据库中。

为了停止线程,我使用servlet的destroy()方法。在这个方法中,我设置条件来结束我的线程。这是正确的做法吗?

我可以在Windows的某个地方看到我的线程存在的迹象吗?我没有在Windows任务管理器中找到它。

2 个答案:

答案 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()