概念的には、次のようなメソッドがあります。
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 にこだわっています。