Quando un thread è finito, non è possibile eseguirlo una volta di più, utilizzando il metodo start(): viene generata un'eccezione. Qualcuno potrebbe spiegare, perché? Cosa si nasconde dietro una tale decisione architettonica?Discussione viene eseguito solo una volta
risposta
Poiché il modo di avere codice eseguito in un thread separato non è di creare un filo, che è legata alla vista di sistema di quello che è un filo (ci sono infinite dettagli sulla distinzione tra fili verdi e di sistema), ma per creare un Runnable, e averlo eseguito da un thread.
Per codice ottimale (poiché la creazione di thread richiede molto tempo), vorrei anche raccomandarvi di non avere direttamente il Runnable eseguito da un thread, ma piuttosto di un ExecutorService, che vi permetterà di usare un pool di thread senza preoccuparsi di tutti quei dettagli.
In ultima analisi, il filo vive, e poi muore. Dopo tutto, l'oggetto Thread
è solo una proxy del vero filo OS sotto. Se vuoi un altro simile, crea una nuova istanza. Non cercare di far risorgere i non morti!
Ciò che sarebbe ancora peggio in un senso architettonico è se il thread non è mai terminato e si è dovuto ucciderlo arbitrariamente per impedirne l'esecuzione.
Inserire un ciclo all'interno del metodo run() se si desidera che esegua una routine più di una volta. È possibile utilizzare un metodo di richiamata per inviare dati/segnali al thread chiamante e reagire quando si verificano.
Non voglio sapere, come aggirare questo, voglio solo sapere, perché. – folone
Quando un thread è finito, non è possibile corsa ancora una volta, con start() Metodo:
Correzione: è possibile chiamare Thread.start()
solo una volta per esempio, qualsiasi chiamata successiva genera un eccezione, non importa se il filo è ancora in esecuzione o meno.
Consentire un "riavvio" dopo il termine dell'esecuzione (è chiaramente un errore mentre il thread è ancora in esecuzione) richiederebbe una logica aggiuntiva e impedirebbe al runtime di rilasciare risorse come lo stack di thread (che è una quantità significativa di memoria) fino a quando l'istanza non viene raccolta; per come è ora, quelli possono essere rilasciati non appena finisce il thread.
semplice applicazione per creare più thread:
import java.io.*;
class PWD extends Thread {
public void run() {
System.out.println(System.getProperty("user.dir"));
return;
}
}
public class HelloMultithread extends Thread{
public static void main(String[] args) throws java.io.IOException {
for(int i = 0; i < 10; i++){
PWD p = new PWD();
p.start();
}
}
}
Come newbee, questo link aiutato:
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html
- 1. setInterval callback viene eseguito solo una volta
- 2. setTimeout viene eseguito solo una volta?
- 3. JS setInterval eseguito solo una volta
- 4. Perché run() viene chiamato solo una volta?
- 5. Perché questo viene aggiunto solo una volta?
- 6. Aggiunta di codice al plugin che viene eseguito solo la prima volta che viene attivato?
- 7. Perché lo stesso codice viene eseguito più velocemente nella discussione?
- 8. jQuery - Solo una volta
- 9. CKQueryOperation queryCompletionBlock viene eseguito solo 3 volte
- 10. JavaScript - eseguito una volta senza booleans
- 11. Gulp Watch eseguito una sola volta
- 12. Java fa javax.swing.Timer eseguito su una nuova discussione?
- 13. HTML5 Audio - Il suono viene riprodotto solo una volta
- 14. Android: FastScrolling SectionIndexer getSections() viene chiamato solo una volta
- 15. Android Toast avviato dal servizio viene visualizzato solo una volta
- 16. HttpWebRequest viene eseguito lentamente la prima volta all'interno di SQLCLR
- 17. Sedano pianificazione dell'attività (Garantire un compito viene eseguito solo uno alla volta)
- 18. JavaFX: utilizzare una discussione più di una volta
- 19. Android - Ottieni posizione solo una volta
- 20. view.getDrawingCache() funziona solo una volta
- 21. .replaceWith() funziona solo una volta
- 22. onPreviewframe chiamato solo una volta
- 23. Esegui setUp solo una volta
- 24. iOS 6 multiple UIWebViews: Javascript viene eseguito solo in uno
- 25. è una volta che il controller viene eseguito più volte su Jmeter?
- 26. Il metodo di installazione della suite di test viene eseguito una volta per ciascun test o solo una volta per tutte?
- 27. Javascript non viene eseguito la prima volta quando accedo a una pagina da un collegamento
- 28. performSelectorOnMainThread non viene eseguito
- 29. OpenMP - crea thread solo una volta
- 30. Chiamare una funzione solo una volta
Sì! ExecutorService è la merda, può anche gestire un BlockingQueue. –