2009-09-02 14 views
5

Devo usare deprecato stop() perché ho bisogno di eseguire le classi Runnable che sono state sviluppate da altri programmatori e non posso usare mentre isRunning == true) all'interno del metodo run.Posso usare thread.stop() in Java se davvero ne ho bisogno?

La domanda è: è sufficiente utilizzare il metodo stop()? I theads non funzionano con nessuna risorsa (come file, DB o connessioni Internet). Ma voglio essere sicuro che JVM non si corromperà dopo che avrò smesso una dozzina di thread con il metodo stop().

P.S .: sì, posso scrivere del codice per testarlo, ma spero che qualcuno conosce la risposta)

risposta

6

o meno. Non c'è niente di "corruttivo" inerente a Thread.stop(). Il problema è che può lasciare oggetti in uno stato danneggiato, quando il thread che li esegue si interrompe improvvisamente. Se il resto del tuo programma non ha visibilità per quegli oggetti, allora va tutto bene. D'altra parte, se alcuni di questi oggetti sono visibili al resto del programma, è possibile che si verifichino problemi difficili da diagnosticare.

+0

Se gli oggetti sarebbero danneggiati "logicamente" ma non fisicamente, non mi interessa in questo caso)) – Roman

0

La JVM non sarà corrotta, ma leggerà attentamente i javadoc per assicurarsi che non soddisfino le loro condizioni per "disastro".

Avrete bisogno di osservare da vicino tutti i monitor di sincronizzazione su cui il filo è trattenuto. Hai menzionato file e socket come risorse sospese, ma dovrai anche considerare eventuali strutture di dati condivise. Assicurarsi inoltre che la gestione delle eccezioni non rilevi RuntimeException s (vedere stop()).

4

Se si utilizza Thread.stop probabilmente si scappa, presupponendo che si abbiano pochi utenti. È eccezionalmente difficile da testare. Può causare un'eccezione ovunque nell'esecuzione del codice. Non è possibile testare tutte le possibili situazioni. Sulla tua macchina nella configurazione potresti non trovare mai un problema; vieni al prossimo aggiornamento di JRE, il tuo programma potrebbe iniziare a fallire con un bug intermittente molto oscuro.

Un caso di errore di esempio è se il thread sta caricando una classe al momento. La classe non viene caricata e non verrà ritentata di nuovo. Il tuo programma è rotto.

1

L'ho risolto nella mia domanda "Are thread stop and friends ever safe?" e, in una delle risposte, ho cercato di capire le precondizioni che renderebbero sicuro l'utilizzo di stop(). Ma questo è ancora un "work in progress".

BTW: il codice di test di scrittura non serve necessariamente. (I test dimostrano solo la presenza di bug non l'assenza di bug). Faresti meglio a cercare di ragionare sul problema, IMO. Ma non è facile :-).

Problemi correlati