gpt4 book ai didi

java - 如何使外部方法可中断?

转载 作者:IT老高 更新时间:2023-10-28 21:06:43 27 4
gpt4 key购买 nike

问题

我正在通过 ExecutorService 多次调用某些外部方法.我希望能够中断这些方法,但不幸的是它们自己不检查中断标志。有什么方法可以强制从这些方法引发异常?

我知道从任意位置抛出异常是 potentially dangerous ,在我的具体情况下,我愿意借此机会并准备应对后果。

详情

“外部方法”是指来自外部库的一些方法,我不能修改它的代码(我可以,但是每当发布新版本时,这将使它成为维护的噩梦)。

外部方法计算量大,不受 IO 限制,因此它们不响应常规中断,我无法强制关闭 channel 或套接字或其他东西。正如我之前提到的,它们也不检查中断标志。

代码在概念上类似于:

// my code
public void myMethod() {
Object o = externalMethod(x);
}

// External code
public class ExternalLibrary {
public Object externalMethod(Object) {
innerMethod1();
innerMethod1();
innerMethod1();
}

private void innerMethod1() {
innerMethod2();
// computationally intensive operations
}

private void innerMethod2() {
// computationally intensive operations
}
}

我的尝试

Thread.stop()理论上会做我想做的事,但它不仅已被弃用,而且仅适用于实际线程,而我正在处理执行器任务(它也可能与 future 的任务共享线程,例如在线程池中工作时) .不过,如果没有找到更好的解决方案,我会将我的代码转换为使用老式线程并使用此方法。

我尝试过的另一个选项是使用特殊的“可中断”注释标记 myMethod() 和类似方法,然后使用 AspectJ(我承认是新手)来捕获所有方法调用那里 - 类似:

@Before("call(* *.*(..)) && withincode(@Interruptable * *.*(..))")
public void checkInterrupt(JoinPoint thisJoinPoint) {
if (Thread.interrupted()) throw new ForcefulInterruption();
}

withincode 不会递归到匹配方法调用的方法,所以我必须将此注释编辑到外部代码中。

最后,这类似于 a previous question of mine - 虽然一个显着的区别是现在我正在处理一个外部库。

最佳答案

我想到了以下奇怪的想法:

  • 使用字节码修改库,例如 Javassist,在字节码的各个点引入中断检查。仅仅在方法的开头可能还不够,因为您提到这些外部方法不是递归的,因此您可能希望在任何时候强制停止它们。在字节码级别执行此操作也会使其响应速度非常快,例如即使外部代码在循环或其他东西中运行,也可以引入中断检查。但是,这会增加一些开销,因此整体性能会变慢。
  • 为外部代码启动单独的进程(例如单独的虚拟机)。中止进程可能比其他解决方案更容易编码。缺点是您需要在外部代码和您的代码之间建立某种通信 channel ,例如IPC、套接字等。第二个缺点是您需要更多的资源(CPU、内存)来启动新的虚拟机,而且它可能是特定于环境的。如果您使用外部代码启动几个任务,而不是数百个任务,这将起作用。此外,性能会受到影响,但计算本身将与原始计算一样快。可以使用 java.lang.Process.destroy() 强制停止进程
  • 使用自定义 SecurityManager,对每个 checkXXX 方法执行中断检查。如果外部代码以某种方式调用特权方法,那么在这些位置中止可能就足够了。如果外部代码定期读取系统属性,例如 java.lang.SecurityManager.checkPropertyAccess(String)。

关于java - 如何使外部方法可中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4544128/

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