Ho un metodo che, concettualmente, sembra qualcosa di simile:Come scrivere metodi interrompibili
Object f(Object o1) {
Object o2 = longProcess1(o1);
Object o3 = longProcess2(o2);
return longProcess3(o3);
}
Dove i processi stessi potrebbe anche essere composto:
Object longProcess1(Object o1) {
Object o2 = longSubProcess1(o1);
return longSubProcess2(o2);
}
E così via, con il diverso processi potenzialmente seduti in diversi moduli. La maggior parte dei processi è lunga perché sono computazionalmente costosi, non vincolati all'IO.
Fin qui tutto bene, ma ora voglio f
nel suo complesso per essere interrompibile. The recommended Java way to do that controlla periodicamente la flag interrotta con Thread.interrupted()
. E 'piuttosto semplice, ma può rapidamente diventare ingombrante se ho bisogno di cambiare i miei metodi per qualcosa di simile:
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);
}
...
Ora, capisco il razionale per lavorare come quella - mi permette di controllare meglio quando il InterruptedException (ad esempio) verrà lanciato, evitando di lasciare oggetti in stati incoerenti - ma Sono curioso di sapere se esiste un modo più elegante per farlo *.
* In Java, non AspectJ, che credo sia molto appropriato qui ma sono bloccato con Java.
sarei preoccupato di situazioni di stallo con il codice che contiene le discussioni che ref vicenda. –