Come uccidere il thread? ..... Come riavviarli di nuovo in multi-threading?Informazioni sulla multi threading
risposta
avvolgo i thread del mio worker nella loro classe e utilizzo una proprietà terminata per terminare il loop proc proc.
dispiace io non sono una versione di Java a portata di mano in questo momento, ma si dovrebbe ottenere l'idea da questo http://pastie.org/880516
using System.Threading;
namespace LoaderDemo
{
class ParserThread
{
private bool m_Terminated;
private AutoResetEvent m_Signal;
private string m_FilePath;
...
public ParserThread(AutoResetEvent signal, string filePath)
{
m_Signal = signal;
m_FilePath = filePath;
Thread thrd = new Thread(this.ThreadProc);
thrd.Start();
}
public bool Terminated {
set { m_Terminated = value; }
}
private Guid Parse(ref string s)
{
//parse the string s and return a populated Guid object
Guid g = new Guid();
// do stuff...
return g;
}
private void ThreadProc()
{
TextReader tr = null;
string line = null;
int lines = 0;
try
{
tr = new StreamReader(m_FilePath);
while ((line = tr.ReadLine()) != null)
{
if (m_Terminated) break;
Guid g = Parse(ref line);
m_GuidList.Add(g);
lines++;
}
m_Signal.Set(); //signal done
}
finally
{
tr.Close();
}
}
}
}
Thread.stop()
uccide un thread, ma è sicuramente non fare desidera fare ciò (consultare la documentazione dell'API per una spiegazione). Thread.interrupt()
invia una notifica asincrona a un thread, in modo che possa chiudersi automaticamente.
Per un testo completo sul multithreading Java, consiglio B. Goetz, Concorrenza Java in pratica, Addison-Wesley Professional.
Thread.stop() è un po 'come mettere una macchina che viaggia a 60 miglia all'ora nel parco per fermarlo ... sicuramente lo ferma, ma stai per lasciare una triste, triste traccia di metallo attorcigliato lungo la strada e la tua auto non sarà mai più la stessa ;-) –
Inoltre, Thread.interrupt non interrompe sempre un thread in attesa su IO. Se sei seriamente intenzionato a progettare per l'interruzione, hai bisogno di un modo per chiudere forzatamente qualsiasi flusso IO il tuo thread di destinazione potrebbe essere in attesa su – radai
Il modo migliore per uccidere un thread è impostare un flag per il thread da guardare. Programma il thread da uscire quando vede che il flag è impostato su true. Non c'è modo di riavviare un thread ucciso.
.... ma potresti salvare il runnable stesso per un uso successivo – radai
Il modo migliore per uccidere un thread è chiamare Thread.interrupt() e hanno il thread anche monitorare periodicamente il suo stato di interrupt. L'aggiunta di un altro booleano è completamente ridondante. – EJP
Oltre a ciò che ha detto EJP, la bandiera arrotolata a mano non funziona bene con gli esecutori. –
Poiché il tuo post è taggato "Java", ho una buona idea di ciò che stai dicendo. Diciamo che si avvia un thread facendo:
Thread foo = new Thread(someRunnable);
foo.start();
Ora che destroy
e gli amici sono obsoleti, è necessario un modo per uccidere il thread. Fortunatamente per te, c'è sempre stato il concetto di "interruzioni". Basta cambiare la tua eseguibile in modo che, in caso di interruzione, esca. Quindi chiama il metodo interrupt
del thread.
foo.interrupt();
Se hai scritto il tuo Runnable per gestirlo correttamente, interromperà qualsiasi cosa stia facendo e terminerà.
Se si desidera avviare, arrestare, riavviare le discussioni a volontà, magari usando il Java 5 il pacchetto di concorrenza sarebbe una buona idea. Puoi avere un Executor che farà un po 'di lavoro, e quando hai bisogno che quel po' di lavoro sia fatto di nuovo, puoi semplicemente riprogrammare l'operazione da eseguire nell'esecutore.
Il metodo preferito per un Thread
morire è per l'esecuzione del metodo run
sino a completamento:
Thread t = new Thread(new Runnable() {
public void run() {
// Do something...
// Thread will end gracefully here.
}
}
volta un thread muore grazia nell'esempio precedente, il Thread
non può essere riavviato. (Cercando di chiamare Thread.start
su un filo che è già stato avviato causerà un IllegalThreadStateException
.)
In tal caso, si può fare un altro esempio del filo e chiamare start
su questo.
Probabilmente un buon posto per ottenere ulteriori informazioni sulla filettatura sarebbe Lesson: Concurrency da The Java Tutorials.
quanto riguarda la tua prima query sul filetto di uccidere:
è possibile trovare ulteriori dettagli sul tema in seguito domande SE:
How to properly stop the Thread in Java?
How can I kill a thread? without using stop();
How to start/stop/restart a thread in Java?
Per quanto riguarda il tuo secondo query di riavvio del thread, non è possibile in java.
Potete trovare sotto i dettagli nella documentazione page
inizio public void()
causa questo thread per iniziare l'esecuzione; la Java Virtual Machine chiama il metodo run di questo thread.
Il risultato è che due thread vengono eseguiti contemporaneamente: il thread corrente (che ritorna dalla chiamata al metodo start) e l'altro thread (che esegue il suo metodo run).
Non è mai legale avviare una discussione più di una volta. In particolare, un thread non può essere riavviato una volta completata l'esecuzione.
Invece di thread normali, è possibile utilizzare l'API simultanea avanzata per la gestione del ciclo di vita dei thread. Date un'occhiata a questo post per i dettagli ExecutorService:
- 1. Multi-threading in EJB
- 2. Multi-Threading HttpClient
- 3. Multi-Threading non funziona correttamente
- 4. Multi-threading con .Net HttpListener
- 5. Supporto Multi-Threading in C11
- 6. multi-threading di un'applicazione web
- 7. Node.js, multi-threading e Socket.io
- 8. Buone pratiche per multi-threading
- 9. Concurrency Visualizer - Informazioni sul threading WPF/CLR
- 10. Chiamate multi-threading nell'applicazione Windows Forms?
- 11. Quanto è difficile il multi-threading Haskell?
- 12. C++: Multi threading e riferimento contando
- 13. Multi: Threading - È questo l'approccio giusto?
- 14. Tutorial sull'utilizzo di multi-threading in jdbc
- 15. Come si aggiunge il multi-threading?
- 16. WCF supporta il multi-threading stesso?
- 17. Specifica Java EE e multi-threading
- 18. Ho bisogno di pensieri sulla creazione di profili di multi-threading in C su Linux
- 19. Malinteso sulla differenza tra programmazione a thread singolo e multi-threading
- 20. Java Multi Threading - casi d'uso del mondo reale
- 21. Informazioni sulla virtualizzazione
- 22. Informazioni sulla risoluzione dell'iPhone
- 23. Informazioni sulla filettatura
- 24. disponibili informazioni sulla versione
- 25. Informazioni sulla callback app.listen()
- 26. Informazioni sulla dichiarazione RegEx
- 27. Informazioni sulla ricerca elastica
- 28. Perché il mio multi-threading è più lento del mio singolo threading?
- 29. Multi-threading per velocizzare un'applicazione di invio di e-mail
- 30. Come fare multi-threading con richieste web asincrone
C'è Thread.stop(): http://java.sun.com/javase/6/docs/api/java/lang/Thread. html # stop(), ma non è consigliabile farlo: http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html –
La pagina effettiva che spiega i pericoli di thread primitives è http://java.sun.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html – Will
@chetans, dovresti riscriverlo in modo che sia più specifico e più sensato. – avpx