У меня есть метод, который концептуально выглядит примерно так:
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);
}
И так далее, с различными процессамипотенциально сидит в разных модулях.Большинство процессов длинные, потому что они вычислительно дороги, не связаны с вводом-выводом.
Пока все хорошо, но теперь я хочу, чтобы 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.