Domanda ho avuto per anni: In questo pseudocodice,Does .awaitTermination() stabilisce che succede prima con il lavoro eseguito nell'esecutore?
ExecutorService svc = Executors.newFixedThreadPool(3);
svc.submit(new Runnable() { /* code A */ });
svc.shutdown();
if(svc.awaitTermination(...)) {
// code B
.awaitTermination()
non è documentato come stabilire accade-prima tra il codice A & B. C'è una ragione che non è?
I ExecutorService e concurrent package javadocs definiscono accade-prima tra i compiti e il lavoro svolto prima che sono state presentate, ma non tra i compiti esecutore e codice dopo il successo .awaitTermination()
chiamata.
Nota, non sto chiedendo critiche di progettazione su come ristrutturare il mio codice per sfruttare le relazioni documentate precedenti. La mia domanda qui è, c'è una ragione per cui i documenti non menzionano l'accaduto - prima in questa situazione?
(Si noti che questo non è un duplicato di 22665198 nonostante il titolo molto appropriato.)
La logica impone che ci debba essere un caso prima di ordinare, ma hai ragione OP, non riesco a trovarlo documentato da nessuna parte. –
L'unica garanzia "ufficiale" è che se si recupera il futuro con 'Future > f = svc.submit (...)' E si chiama 'f.get()', quindi si ha la relazione hb. – assylias
@assylias quindi, perché è quello? Devo davvero '.get()' ogni compito? So di aver scritto un sacco di codice che presuppone che un successo '.awaitTermination()' stabilisce * succede-prima *. – tariksbl