2016-03-16 12 views
7

Ho scritto un codice di base in Thread e l'output che ho ottenuto è piuttosto sorprendente.Poco confuso sul comportamento del thread

public class ThreadImp implements Runnable{ 

    public static void main(String[] args) { 
     ThreadImp threadImp = new ThreadImp(); 
     Thread t =new Thread(threadImp); 
     t.setName("Fred"); 
     t.start(); 
     threadImp.run(); 
     t.run(); 

    } 
    public void run(){ 
     System.out.println("Current Thread: "+ Thread.currentThread()); 
    } 
} 

L'output qui mi aspetto è che verrà stampata

Discussione attuale: Discussione [principale, 5, principale]

Discussione attuale: Discussione [Fred, 5, principale ]

Discussione attuale: Discussione [principale, 5, principale]

Questo risultato posso capisci, c'è solo un thread che sto creando i.e Thread Fred. Altre due chiamate per eseguire il metodo sono come chiamare un metodo normale.

Ma quello che non riesco a capire a volte quando eseguo lo stesso programma ottengo il seguente output. Quindi qualcuno può spiegarmelo perché si comporta in questo modo.

Discussione attuale: Discussione [principale, 5, principale]

Discussione attuale: Discussione [Fred, 5, principale]

+1

Comportarsi esattamente come? Che l'esecuzione non è coerente? – Gimby

+1

aggiungi 't.join()' dopo 't.start()' – fukanchik

+0

La cosa più importante da notare è che Java non è thread-safe, il che significa che non dovresti progettare il tuo programma assumendo che i thread si comportino nello stesso modo ogni volta. Il modo in cui i thread si comportano potrebbe anche variare da macchina a macchina. –

risposta

10

ti chiamano Thread.run() (che normalmente non dovrebbe chiamare direttamente), e che non fa nulla se il Thread ha completato e si è ripulito:

@Override 
public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 

Fonte: Java 7 aggiornamento 79

Dove target è la condizione eseguibile. Il campo target è impostato su null quando il thread è terminato:

/** 
* This method is called by the system to give a Thread 
* a chance to clean up before it actually exits. 
*/ 
private void exit() { 
    if (group != null) { 
     group.threadTerminated(this); 
     group = null; 
    } 
    /* Aggressively null out all reference fields: see bug 4006245 */ 
    target = null; 
    /* Speed the release of some of these resources */ 
    threadLocals = null; 
    inheritableThreadLocals = null; 
    inheritedAccessControlContext = null; 
    blocker = null; 
    uncaughtExceptionHandler = null; 
} 

Fonte: Java 7 aggiornamento 79

Così l'uscita esatta (fra cui l'ordine, e se si ottiene due o tre messaggi) dipende dalla tempistica, dalla programmazione, ecc.

+1

Il thread imposta 'null' su' target' una volta terminata l'esecuzione? Puoi condividere il pezzo di codice dove lo fa? –

+0

@PabloMatiasGomez Aggiunto –

+0

Aha! 'Non è mai legale iniziare una discussione più di una volta. In particolare, un thread non può essere riavviato una volta completata l'esecuzione. – fukanchik

Problemi correlati