- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在不手动检查 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/
我是一名优秀的程序员,十分优秀!