如何使外部方法可中断?
问题
我正在通过执行器服务运行对某些外部方法的多次调用。我希望能够中断这些方法,但不幸的是,它们不会自己检查中断标志。有没有办法强制从这些方法引发异常?
我知道从任意位置抛出异常是潜在的危险,在我的具体案例中,我愿意抓住这个机会并准备处理后果。
详
通过“外部方法”,我的意思是来自外部库的一些方法,我不能修改它的代码(好吧,我可以,但每当新版本发布时,这都会使它成为维护的噩梦)。
外部方法在计算上很昂贵,不是IO绑定的,所以它们不响应常规中断,我无法强制关闭通道或套接字或其他内容。正如我之前提到的,他们也不检查中断标志。
该代码在概念上类似于:
// 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()
将执行我想要的操作,但它不仅已弃用,而且也仅适用于实际线程,而我正在处理执行器任务(也可能与将来的任务共享线程,例如在线程池中工作时)。但是,如果没有找到更好的解决方案,我将转换我的代码以使用老式的线程,并使用此方法。
我尝试过的另一种选择是使用特殊的“可中断”注释标记和类似的方法,然后使用AspectJ(我承认我是新手)来捕获那里的所有方法调用 - 如下所示:myMethod()
@Before("call(* *.*(..)) && withincode(@Interruptable * *.*(..))")
public void checkInterrupt(JoinPoint thisJoinPoint) {
if (Thread.interrupted()) throw new ForcefulInterruption();
}
但是不是由匹配方法调用的方法的递归,因此我必须将此注释编辑到外部代码中。withincode
最后,这与我之前的问题类似 - 尽管一个显着的区别是现在我正在处理外部库。