【问题标题】:how to shut down a thread from a different one?如何关闭来自不同线程的线程?
【发布时间】:2023-03-06 14:15:01
【问题描述】:

在我的应用程序中,每个请求都有自己的线程。我使用 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();
                        }
                    }
                }

【问题讨论】:

    标签: java multithreading jmx jconsole


    【解决方案1】:

    但是这个 InterruptedException 将应用于 currentThread 而不是我真正想要停止的线程。

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

    任何提示如何关闭标记的线程?

    你不能从另一个线程干净地关闭一个线程。

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

    【讨论】:

    • 请注意 - 一些阻塞的第 3 方函数可以将 InterputException 包装在其他函数中,例如 IOException 左右(Axis 这样做)。所以总是检查是否被中断。
    【解决方案2】:

    抛出 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);
    }
    

    如果您使用的是 Channels,您还需要捕获 ClosedByInterruptException。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 2019-07-14
        • 1970-01-01
        • 2020-07-19
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多