Domanda

Ho una chiamata a System.exit(1) nel mio programma multi-threaded. Tuttavia di tanto in tanto, invece di codice di ritorno 1, il programma termina con codice di ritorno 0. I non hanno alcuna altra chiamate System.exit() e sono sicuro che il programma non esce in modo pulito. Quale può essere la causa, e come posso evitarlo?

Si noti che l'errore è intermittente e non in grado di riprodurre lo stesso comportamento nei programmi filettati singoli.

È stato utile?

Soluzione

Modifica il tuo disegno per eseguire un arresto più controllato.

Non ci dovrebbe essere alcuna aspettativa che chiamare System.exit() in un'applicazione con più thread avrebbe mai causa il programma per uscire in modo pulito.

Invece di chiamare System.exit() di lasciare il programma, si deve inviare messaggi di chiusura per ogni componente e l'utilizzo in movimento Thread.join() di recuperare qualsiasi thread creati. L'applicazione deve essere in grado di spegnere tutti i pezzi bene in questo modo. Il comando finale nel thread principale dovrebbe essere quello di restituire il codice di uscita. Se basta chiamare System.exit(), si sta lasciando tutti questi spegnimento dettagli per la JVM, che è solo andando a prendere un approccio e uccidere tutto pesante sul posto.

Hai usato Runtime.getRuntime.addShutdownHook() a tutti? Una chiamata a System.exit() invocherà eventuali hook di chiusura che possono essere installate e questo potrebbe essere cambiando il codice di uscita.

Altri suggerimenti

La documentazione di runtime. halt (int) dice quanto segue riguardo il suo argomento:

  

Se l'uscita (in modo equivalente, System.exit) metodo è già stato invocato allora questo codice di stato avrà la precedenza il codice di stato passato a quel metodo.

Quindi, forse, qualcosa sta invocando Runtime.halt(int). In un gancio di arresto o finalizer?

Credo che l'unico modo in cui questo può accadere se i vostri termina JVM prima System.exit(1) effettivamente eseguiti. Pensi che questo può essere possibile nel vostro sistema?

entrambi i casi, il codice con System.exit(1) viene eseguito in un thread daemon, e così, quando tutti gli altri (non-daemon) discussioni dal vivo terminato di lavorare uscite JVM in modo pulito (o non in modo pulito, come è ancora possibile ottenere 0 codice di uscita se il programma genera un'eccezione!)

In alternativa, come @Erick Robertson ha suggerito, forse qualcosa sta modificando lo stato di uscita da un gancio o qualcosa del genere, anche se non sono sicuro di come questo sia possibile.

Nota: si prega di ignorare il mio commento precedente. Chiamando System.exit(1) terminerà tutti i daemon / thread non demone in esecuzione tutto insieme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top