2013-04-05 10 views
7

Non capisco la differenza tra l'avvio e l'esecuzione di una discussione, ho testato entrambi i metodi e hanno prodotto lo stesso risultato, prima ho usato una combinazione di run() e avvio sullo stesso filetto e hanno fatto la stessa funzione come segue:Differenza tra l'esecuzione e l'avvio di una discussione

public class TestRunAndStart implements Runnable { 
public void run() { 
    System.out.println("running"); 
} 
public static void main(String[] args) { 
    Thread t = new Thread(new TestRunAndStart()); 
    t.run(); 
    t.run(); 
    t.start(); 
} 

}

l'output è:

running 
running 
running 

poi ho visto javadoc del metodo run() dicono che: If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns così ho cercato di utilizzare il metodo run() senza un eseguibile separato come segue:

public class TestRun extends Thread { 
public void run(){ 
    System.out.println("Running Normal Thread"); 
} 
public static void main(String[]args){ 
    TestRun TR=new TestRun(); 
    TR.run(); 
    } 

} 

ed esegue anche il metodo run() e stampa Running Normal Thread anche se è costruito senza un eseguibile separato! quindi qual è la differenza principale tra i due metodi

+0

non è un duplicato! – naXa

+0

Tuttavia è troppo tardi. Ma potrebbe essere utile per gli altri. Sostituire l'istruzione SOP del metodo di esecuzione con "System.out.println ("thread in esecuzione ..." + Thread.currentThread(). getName()); "e quindi esegue il programma. Vedrai la differenza. L'output è" thread in esecuzione ... main thread in esecuzione ... main thread in esecuzione ... Thread-0 " – user320676

risposta

23

Thread.run() non generare un nuovo thread, mentre Thread.start() fa, cioè Thread.run in realtà corre sullo stesso thread come quello del chiamante, mentre Thread.start() crea un nuovo thread in cui viene eseguito il compito.

+0

ok, ma non capisco il significato di" Se questo thread è stato costruito utilizzando un oggetto Runnnn eseguibile separato "la classe TestRun nel mio esempio è considerata costruita senza Runnable separato ?? –

+0

@JavaPlayer Verifica *** [this] (http://stackoverflow.com/questions/262816/when-would-you-call-javas-thread-run-instead-of-thread-start) *** Pubblica per la tua risposta –

11

Quando si chiama run, si sta solo eseguendo il metodo run nel thread corrente. Il codice così non sarà multi-thread.

Se si chiama start, verrà avviato un nuovo thread e il metodo run verrà eseguito su questo nuovo thread.

0

Nel primo esempio, si chiama il metodo run() direttamente dal thread principale e quindi una volta da un thread separato chiamando t.start().

Nel secondo caso, t.start() crea un contesto thread separato e, in tale contesto, chiama t.run().

È incluso anche la documentazione per il metodo run():

Se questa discussione è stato costruito utilizzando un oggetto Runnable corsa separata, poi metodo run di quell'oggetto Runnable è chiamato; In caso contrario, questo metodo non fa nulla e restituisce

Questo è vero, nel senso che se non si esegue l'override del metodo run(), allora sarà semplicemente restituire, causando quel filo per terminare. Hai sovrascritto il metodo run() negli oggetti Thread, quindi il metodo sottoposto a override (che non fa nulla) non viene chiamato.

1

Un filo attraversa varie fasi durante il suo ciclo di vita. Quando si chiama il thread del metodo start() passa allo stato di esecuzione e non allo stato di esecuzione.

Quindi lo schedulatore visualizza una discussione dal pool di thread in attesa di essere eseguita e la inserisce nella fase di esecuzione . A questa esecuzione effettiva del thread avviene.

Problemi correlati