Java 如何关闭不同线程的线程?

Java 如何关闭不同线程的线程?,java,multithreading,jmx,jconsole,Java,Multithreading,Jmx,Jconsole,在我的应用程序中,每个请求都有自己的线程。我使用JMX/JConsole来监视它们,测量经过的时间。如果请求需要太多时间,我希望通过中断底层线程来停止它。 在从JConsole调用的方法中,我迭代线程列表,并在正确的实例上调用interrupt() 然而,在线程实例上简单地调用interrupt()方法只会设置一个标志,所以我也需要抛出一个InterruptedException。 但这个InterruptedException将应用于currentThread,而不是我实际想要停止的线程。有没

在我的应用程序中,每个请求都有自己的线程。我使用JMX/JConsole来监视它们,测量经过的时间。如果请求需要太多时间,我希望通过中断底层线程来停止它。 在从JConsole调用的方法中,我迭代线程列表,并在正确的实例上调用interrupt() 然而,在线程实例上简单地调用interrupt()方法只会设置一个标志,所以我也需要抛出一个InterruptedException。 但这个InterruptedException将应用于currentThread,而不是我实际想要停止的线程。有没有关于如何关闭标记线程的提示

    while (iterator.hasNext()) {
                    RequestHolder rh = iterator.next();
                    if (rh.getThread().getId() == threadId) {
                        rh.getThread().interrupt();
                        if(rh.getThread().isInterrupted()){

                            throw new InterruptedException();
                        }
                    }
                }
但这个InterruptedException将应用于currentThread,而不是我实际想要停止的线程

您可以使用
isInterrupted
检查任何线程的中断状态。但是,如果您不知道如何以及何时使用中断,则不建议将其作为黑盒方法

有没有关于如何关闭标记线程的提示

    while (iterator.hasNext()) {
                    RequestHolder rh = iterator.next();
                    if (rh.getThread().getId() == threadId) {
                        rh.getThread().interrupt();
                        if(rh.getThread().isInterrupted()){

                            throw new InterruptedException();
                        }
                    }
                }
无法从另一个线程完全关闭一个线程


但这很简单。在正在运行的线程中,定期检查
中断
,例如循环捕获
中断异常
中的阻塞函数。当您看到线程中的中断时,请使其自行终止。从某种意义上说,线程实现它们自己的终止策略。

抛出InterruptedException没有任何好处。可以删除
if(rh.getThread().isInterrupted())

每个线程都必须监视自己的中断状态,并且当它看到自己被中断时,必须优雅地退出

通常代码如下所示:

try {
    InputStream in = socket.getInputStream();
    while (in.read(buffer) >= 0) {
        if (Thread.interrupted()) {
            logger.log(Level.FINE, "Interrupted; exiting");
            break;
        }

        // Process request buffer here
    }
} catch (InterruptedIOException e) {
    logger.log(Level.FINE, "Interrupted; exiting", e);
}

如果您正在使用通道,您还需要捕获ClosedByInterruptException。

您可以将要终止的线程的引用传递到负责执行第一个线程终止的线程的构造函数中。然后,您可以使用来自另一个线程的引用来销毁该线程。

只需注意-某些阻止第三方函数可以将InterputException包装到其他线程中,例如IOException或其他(Axis这样做)。因此,始终检查是否被中断。