2013-04-16 10 views
5

Nella mia applicazione ho un thread che esegue in modo permanente l'heartbeat di invio ogni 5 minuti a un'applicazione di monitoraggio.Come uscire correttamente dall'applicazione

Se la mia applicazione fallisce in un blocco di eccezioni, devo uscire dal thread che lo sta eseguendo (il ciclo while è basato sul thread che non viene interrotto).

Questo significa che in ogni cattura avrò bisogno di un'uscita di sistema o di una chiamata per interrompere quel thread? Questo sembra un approccio molto disordinato ma non so come altro.

Grazie

+0

È possibile rendere il thread un thread daemon –

+2

è possibile contrassegnare il thread di hearbeat come daemon - http://stackoverflow.com/questions/2213340/what-is-daemon-thread-in-java – Scorpion

risposta

4

è possibile designare questa discussione ad essere un thread demone. Termina con l'applicazione.

+1

Questo ha senso perché è un thread ausiliario, e non sta facendo il lavoro principale, quindi può essere contrassegnato come un thread daemon. –

1

Considerare l'utilizzo di un oggetto leggibile sia dall'applicazione principale che dal thread. Se l'applicazione principale incontra un'eccezione dovrebbe avere un blocco finally che imposta quell'oggetto che indica il thread heartbeat che l'applicazione ha o sta chiudendo.

Questo potrebbe fornire un meccanismo per l'heartbeat per inviare un ultimo messaggio "morto". Questo può dire al monitor che la tua domanda è morta ed elencare il motivo piuttosto che semplicemente non inviare un heartbeat.

+1

@Jatin fornisce una spiegazione migliore per ciò che stavo cercando di trasmettere. – Freiheit

1

Idealmente, si vorrebbe un modo per trasmettere un messaggio dall'applicazione alla discussione, per terminare.

Dipende dall'espressione su cui si basa il ciclo while. Se attualmente il codice è di tipo:

while(expression) 

Dove espressione restituisce qualche booleana, può sempre essere sostituito con:

while(Thread.currentThread.interrupted()){ 
    if(!expression) 
    break; 
//.... 
} 

Questa sarebbe la soluzione perfetta. Oppure puoi usare qualche booleano per notificarlo. O probabilmente se il tuo while è basato sulla coda, quindi aggiungi POISON_PILL, che rappresenterà che è ora di uscire dal ciclo.

Daemon thread è anche una soluzione è menzionata sopra, ma dipende se si desidera memorizzare alcuni dati o chiudere/gestire alcune risorse. Sarebbe un problema allora.

In definitiva per la robustezza, è necessario elaborare una politica di arresto adatta.

+0

Bene, per robustezza, direi che nessun arresto esplicito è la politica di battimento, con un ampio margine. –

+0

@MartinJames Mi spiace, cosa intendi per arresto esplicito> – Jatin

+1

in cui scrivi effettivamente il codice utente per provare a terminare una discussione, piuttosto che lasciare che sia il sistema operativo a farlo. –