Tengo un método que, conceptualmente, se ve algo como:Cómo escribir métodos interrumpible
Object f(Object o1) {
Object o2 = longProcess1(o1);
Object o3 = longProcess2(o2);
return longProcess3(o3);
}
Cuando los procedimientos mismos también podrían estar compuesto de:
Object longProcess1(Object o1) {
Object o2 = longSubProcess1(o1);
return longSubProcess2(o2);
}
Y así sucesivamente, con los diferentes procesos potencialmente sentados en diferentes módulos. La mayoría de los procesos son largos porque son computacionalmente costosos, no vinculados a IO.
Hasta ahora todo bien, pero ahora quiero que f
en su totalidad sea interrumpible. The recommended Java way to do that es verificar periódicamente la bandera interrumpida con Thread.interrupted()
. Es bastante sencillo, pero rápidamente puede llegar a ser engorroso si necesito cambiar mis métodos para algo como:
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);
}
...
Ahora, entiendo lo racional para trabajar de esa manera - que me permite un mejor control cuando el InterruptedException (por ejemplo) se lanzará, evitando dejar objetos en estados inconsistentes, pero Tengo curiosidad por saber si hay una manera más elegante de hacerlo *.
* En Java, no AspectJ, que supongo que es muy apropiado aquí, pero estoy atascado con Java.
Estaría preocupado por los puntos muertos con código que contiene hilos que Ref entre sí. –