Как писать прерываемые методы
У меня есть метод, который концептуально выглядит примерно так:
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.