Qual è la differenza tra Thread.start () e Thread.run ()?

Perché chiamiamo il metodo start() , che a sua volta chiama il metodo run() ?
Non possiamo effettuare direttamente una chiamata a run() ?

Per favore, fai un esempio dove c’è una differenza.

No, non puoi. L’esecuzione di chiamata eseguirà il metodo run () nello stesso thread, senza iniziare il nuovo thread.

Perché chiamiamo il metodo start() , che a sua volta chiama il metodo run() ?

No, è impreciso. start() a sua volta non chiama il metodo run. invece avvia il thread che esegue il metodo run. Questo è nativo

Non possiamo effettuare direttamente una chiamata a run() ?

Se si chiama run() direttamente non si avvia il thread, si esegue semplicemente il metodo sullo stesso metodo del chiamante.

Per favore, fai un esempio dove c’è una differenza.

Ci sono milioni sul web. Quindi non duplicare.

In realtà thread.start() crea un nuovo thread e ha il proprio scenario di esecuzione.

ma thread.run() non crea alcun nuovo thread, ma esegue il metodo run nel thread corrente corrente.

Quindi ragazzi se state usando thread.run() allora pensate che cosa è l’uso del multi-threading se volete che un solo thread esegua tutto il metodo run.

Perché start () non chiama semplicemente run (). Inizia un nuovo thread e in quel thread chiama run ().

non è ansible eseguire direttamente il metodo run (). Ogni volta che si avvia il thread usando thread.start (), viene chiamato il metodo run () ed eseguita l’ulteriore operazione.

La differenza principale è che quando viene chiamato il metodo start () viene creato un nuovo Thread e il codice all’interno del metodo run () viene eseguito nel nuovo Thread.Se si chiama direttamente il metodo run () non viene creato un nuovo Thread e il codice all’interno di run () verrà eseguito sulla discussione corrente.

La maggior parte delle volte chiamate run () è un bug o errore di programmazione perché il chiamante ha intenzione di chiamare start () per creare un nuovo thread e questo errore può essere rilevato da molti strumenti di copertura del codice statico come findbugs. Se si desidera eseguire un’attività che richiede molto tempo di chiamare sempre il metodo start () altrimenti il ​​thread principale si bloccherà durante l’esecuzione di un’attività che richiede tempo se si chiama direttamente il metodo run (). Un’altra differenza tra start vs run in thread Java è che non è ansible chiamare il metodo start () due volte su object thread. una volta avviato, la seconda chiamata di start () genererà IllegalStateException in Java mentre è ansible chiamare il metodo run () due volte.

Se chiamate direttamente run (), il codice viene eseguito nel thread chiamante. Chiamando start (), viene creato un nuovo thread diverso dal thread principale ed eseguito in parallelo.

Perché start(); è sincronizzato ed run(); è un metodo semplice / regolare. Come sa che java inizia l’esecuzione da main(); metodo. Poiché thread sa di avviare l’esecuzione da run();

Ecco il codice sorgente della class Thread :

run(); codice:

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

start(); codice:

 public synchronized void start() { /** * This method is not invoked for the main method thread or "system" * group threads created/set up by the VM. Any new functionality added * to this method in the future may have to also be added to the VM. * * A zero status value corresponds to state "NEW". */ if (threadStatus != 0) throw new IllegalThreadStateException(); /* Notify the group that this thread is about to be started * so that it can be added to the group's list of threads * and the group's unstarted count can be decremented. */ group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { /* do nothing. If start0 threw a Throwable then it will be passed up the call stack */ } } } 

In breve start(); è il gestore dei thread, come gestire ecc. ed run(); è il punto cruciale del funzionamento del filo.

questo è il lavoro svolto dal metodo di avvio

 synchronized public void start() { //it calls start0() method internally and start0() method does below //create a real child thread and register with thread scheduler //create runtime stack for child thread //call run() on underlying Runtime object }