2010-04-22 17 views
5

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

7

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.

+0

Sì! ExecutorService è la merda, può anche gestire un BlockingQueue. –

2

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!

0

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.

+0

Non voglio sapere, come aggirare questo, voglio solo sapere, perché. – folone

5

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.

0

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

Problemi correlati