我有一个方法,从概念上讲,它看起来像:
Object f(Object o1) {
Object o2 = longProcess1(o1);
Object o3 = longProcess2(o2);
return longProcess3(o3);
}
过程本身也可能是复合的:
Object longProcess1(Object o1) {
Object o2 = longSubProcess1(o1);
return longSubProcess2(o2);
}
依此类推,不同的进程可能位于不同的模块中。大多数进程都很长,因为它们计算量大,不受 IO 限制。
到目前为止一切顺利,但现在我希望f
作为一个整体可以被打断。推荐的 Java 方法是定期检查中断标志Thread.interrupted()
。这非常简单,但是如果我需要将方法更改为以下内容,它很快就会变得很麻烦:
Object f(Object o1) {
Object o2 = longProcess1(o1);
if (Thread.interrupted()) throw new InterruptedException();
Object o3 = longProcess2(o2);
if (Thread.interrupted()) throw new InterruptedException();
return longProcess3(o3);
}
Object longProcess1(Object o1) {
Object o2 = longSubProcess1(o1);
if (Thread.interrupted()) throw new InterruptedException();
return longSubProcess2(o2);
}
...
现在,我确实理解了这样工作的理由——它让我能够更好地控制何时抛出 InterruptedException(例如),避免让对象处于不一致的状态——但我很想知道是否有更优雅的方式来做那*。
* 在 Java 中,而不是 AspectJ,我想这在这里非常合适,但我坚持使用 Java。