Java 如何在系统中找到我的线程?

Java 如何在系统中找到我的线程?,java,multithreading,servlets,Java,Multithreading,Servlets,我正在编写一个servlet,它必须在init()中启动一个线程,并在服务器停止后正确地停止它。线程下载一个网页,解析它并将数据存储在MySQL数据库中 为了停止线程,我使用servlet的destroy()方法。在这个方法中,我设置了结束线程的条件。这样做对吗 我能在窗口的某个地方看到我的线程存在的迹象吗?我没有在Windows任务管理器中找到它。Windows任务管理器仅显示进程,而不是单个线程。事实上,JVM管理的线程属于用户线程的类别,这是与内核线程(由操作系统管理)不同的类别 要执行您

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

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


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

Windows任务管理器仅显示进程,而不是单个线程。事实上,JVM管理的线程属于用户线程的类别,这是与内核线程(由操作系统管理)不同的类别

要执行您想要的操作,您必须保留对
线程
对象的全局引用,以便它在不同方法中可见。最好是让线程在标志上旋转并通过设置标志来停止,而不是使用类似
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)
来停止它。不,你在windows中看不到它们——你看到的是进程,而不是线程。线程是jvm进程的内部线程

您可以在中看到线程(也包括在JDK/bin/jvisualvm中)。只需连接到tomcat并查看线程

destroy()
方法是一个不错的选择。但是调用
thread.interrupt()


更好的方法是使用。创建一个执行器,并向其提交一个
Runnable
。在
destroy()
上,您只需调用
executor.shutdown()

+1。请注意,通常
Thread.interrupt()
和family是比特殊的volatile boolean标志更好的选择,因为线程中断允许轻松关闭线程,即使它位于阻塞方法中(很少有例外)。它还可以很好地与许多现有的标准并发实用程序(如
Executors
Future
s)配合使用。标志声明为servlet的字段。我可以将标志设置为servlet类的字段,但不能设置为ReadTask的字段。因为我想在Init()中声明ThreadTask。最好将它放在线程内部,这样线程停止逻辑就不会暴露在外部。对不起。如果我只在这个方法中设置了标志,为什么destroy调用会中断?因为线程不应该永远运行。事实上,tomcat无论如何都会打断它,但你会得到一个警告