gpt4 book ai didi

Java如何在超时后杀死线程而不检查中断

转载 作者:行者123 更新时间:2023-11-30 05:31:06 24 4
gpt4 key购买 nike

如何在不手动检查 Thread.currentThread().isInterrupted() 的情况下杀死 Java 中的线程?

例如,如何在超时后终止这样的线程:

new Thread(() -> {
Result result = ExternalLibrary.performSomeReallyLongRunningTaskWithNoSideEffects();
System.out.println(result);
}).start();

我们无法修改外部库代码以在各处添加 isInterrupted 检查

最佳答案

对于超时部分,如果您愿意使用 Guava ,SimpleTimeLimiter是一个不错的选择。

如果长时间运行的线程频繁进行 IO,则可能就像使用中断一样简单(对于 SimpleTimeLimiter 来说,您只需使用 amInterruptible=true 进行调用),因为 IO 操作通常会检查中断标志并抛出 InterruptedException,您希望第三方代码能够传播或使用该异常来终止操作。

如果您长时间运行的方法不检查中断或忽略它们,并且修改它不是一个选项,您可能会陷入Thread.stop(),即deprecated 。如果长时间运行的任务在其操作中充分隔离,即不与其他正在运行的线程共享变量,并且不打开任何资源,那么这样做可能就可以了。但没有办法确定。我肯定会先尝试中断,它可能会起作用。

如果第 3 方代码确实不透明且不可修改,则另一种选择是将其转换为自己的 jar,并将其作为外部进程调用。这样,该进程始终可以与您的应用程序隔离地被终止。

无论是使用 Thread.stop() 或向单独的进程发送终止信号,您都可以执行这些操作来响应抛出的 UncheckedTimeoutException 异常通过 SimpleTimeLimiter#callWithTimeout(...)

关于Java如何在超时后杀死线程而不检查中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57548379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com