2013-04-05 8 views
7

Nie rozumiem różnicy między uruchomieniem i uruchomieniem wątku, testowałem obie metody i dają one ten sam wynik, najpierw użyłem kombinacji run() i rozpocząłem na tym samym wątku i nie taką samą funkcję, jak następuje:Różnica między uruchomieniem a uruchomieniem wątku

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(); 
} 

}

wyjście jest:

running 
running 
running 

potem ten javadoc sposobu uruchomienia(), że: 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 więc próbowałem użyć metody run() bez oddzielnego runnable następująco:

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(); 
    } 

} 

a także wykonuje metodę run() i wydruki Running Normal Thread chociaż jest skonstruowany bez oddzielnego runnable! więc co jest główną różnicą pomiędzy tymi dwoma metodami

+0

to nie duplikat! – naXa

+0

Jednak jest już za późno. Ale może być pomocna dla innych.Odrzuć instrukcję SOP metody uruchamiania według "System.out.println ("running thread ..." + Thread.currentThread(). getName()); "a następnie wykonaj swój program, zobaczysz różnicę." Output is "running thread ... main bieżący wątek ... main bieżący wątek ... Wątek-0 " – user320676

Odpowiedz

23

Thread.run() nie tarło nowy wątek natomiast Thread.start() robi, tj Thread.run faktycznie działa na tym samym wątku jako że rozmówcy natomiast Thread.start() tworzy nowy wątek, w którym prowadzony jest zadanie.

+0

ok, ale nie rozumiem znaczenia" Jeśli ten wątek został skonstruowany przy użyciu oddzielnego obiektu Runnable run "to klasa TestRun w moim przykładzie jest uważana za zbudowaną bez osobnego zestawu Runnable ? –

+0

@JavaPlayer Check *** [this] (http://stackoverflow.com/questions/262816/when-would-you-call-javas-thread-run-instead-of-thread-start) *** post dla twojej odpowiedzi –

11

Po wywołaniu run, po prostu wykonujesz metodę run w bieżącym wątku. W ten sposób kod nie będzie wielowątkowy.

Jeśli zadzwonisz pod numer start, rozpocznie się nowy wątek, a na nowym wątku zostanie wykonana metoda run.

0

W pierwszym przykładzie wywołujesz metodę run() bezpośrednio z głównego wątku, a następnie raz z oddzielnego wątku, wywołując t.start().

W drugim przypadku t.start() tworzy oddzielny kontekst wątku, az tego kontekstu wywołuje t.run().

również zawarte w dokumentacji do biegu() Sposób:

Jeśli nić została skonstruowana przy użyciu oddzielnego Runnable przedmiotu uruchamiania, następnie metodą prowadzonego przypisanymi obiekt nazywa; w przeciwnym razie, metoda ta nic nie robi i zwraca

To prawda, że ​​jeśli nie zastąpić metodę run(), to będzie po prostu wrócić, co powoduje, że wątek, aby zakończyć. Przesłoniłeś metodę run() w swoich obiektach wątku, więc metoda nadpisywana (która nic nie robi) nie jest wywoływana.

1

Nić przechodzi przez różne etapy podczas jej cyklu życia. Po wywołaniu wątek metody przechodzi w stan możliwy do uruchomienia, a nie działający.

Następnie program planujący wyświetla jeden wątek z puli wątków oczekujących na wykonanie i umieszcza go na etapie biegu . W tym faktycznym wykonaniu wątku ma miejsce.

Powiązane problemy