Sto scrivendo un'applicazione che esegue le azioni del menu file utilizzando SwingWorker
. Ogni metodo chiamato restituisce un valore boolean
che indica se l'operazione è stata eseguita correttamente o meno.Come si legge un risultato di SwingWorker * senza * busy busy?
Al momento sto usando occupato in attesa del risultato, in questo modo:
public boolean executeOperation() {
final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override
protected Boolean doInBackground() throws Exception {
// ..
if (aborted) {
return false;
}
// ..
return true;
}
};
worker.execute();
// busy wait
while (!worker.isDone())
;
try {
return worker.get().booleanValue();
} catch (Exception e) {
// handle exceptions ..
return false;
}
}
c'è un modo meno polling-intenso di risolvere questo?
Utilizzando worker.get()
direttamente non avrebbe funzionato, in quanto blocca l'EDT, in attesa che il compito di finire - il che significa anche i dialoghi apro dall'interno del SwingWorker
non si sarebbe dipinta.
MODIFICA: Se possibile, vorrei evitare che il metodo (o il lavoratore) comunichi il risultato in modo asincrono. Sto implementando diversi metodi brevi (file -> apri, nuovo, chiudi, salva, salva come, uscita) che fanno affidamento l'uno sull'altro (ad esempio quando il tentativo di uscire, chiudere le chiamate chiudere, chiudere potrebbe chiamare salvare, salvare potrebbe chiamare salvare come). Risolvere questo in modo asincrono sembra rendere il codice molto più complicato.
È sempre possibile inserire un Thread.sleep (100) nel loop. –
Ciò non cambia il fatto che si sta eseguendo il polling per un risultato, invece di fare in modo che l'oggetto esegua il calcolo quando viene eseguito. – mcfinnigan