Powiedzmy, że mamy te dwa Runnable:
class R1 implements Runnable {
public void run() { … }
…
}
class R2 implements Runnable {
public void run() { … }
…
}
Jaka jest różnica między tym:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
r1.run();
r2.run();
}
I to:
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
java
multithreading
concurrency
runnable
Ori Popowski
źródło
źródło
start()
jest to metoda, która wywołuje metodę natvie, która musi powodować, że rzeczy związane z wątkiem OS się zdarzają.start()
źródło metody jest tutaj .Jeśli wywołujesz
run()
bezpośrednio, jest on wykonywany w wątku wywołującym, tak jak każde inne wywołanie metody.Thread.start()
jest wymagane do utworzenia nowego wątku, tak abyrun
metoda runnable była wykonywana równolegle.źródło
Thread.start()
wywołanie powoduje przeniesienie stanu wątku z nowego stanu do stanu Runnable . Runnable nie oznacza, że wątek jest uruchomiony. Po zainicjowaniu wątku macierzystego wątek macierzysty wywołujerun()
metodę w wątku Java, co powoduje zmianę stanu wątku z Runnable na Running . Po zakończeniu wątku wszystkie zasoby dla wątku rodzimego i Java zostają zwolnione.Różnica polega na tym, że
Thread.start()
uruchamia wątek, który wywołujerun()
metodę, aRunnable.run()
tylko wywołujerun()
metodę w bieżącym wątku.źródło
Różnicą jest to, że gdy program wywołuje
start()
metodzie nowy wątek jest tworzony i wewnątrz kodrun()
jest wykonywany w nowym wątku natomiast jeśli wywołanierun()
metody bezpośrednio żaden nowy wątek zostanie utworzony i kod wewnątrzrun()
będzie wykonać w bieżącym wątku bezpośrednio.Kolejna różnica między
start()
irun()
w wątku Java jest to, że nie można nazwaćstart()
dwukrotnie. Po uruchomieniu drugiestart()
wywołanie zostanie wygenerowaneIllegalStateException
w Javie, podczas gdy można wywołaćrun()
metodę kilka razy, ponieważ jest to zwykła metoda.źródło
W rzeczywistości
Thread.start()
tworzy nowy wątek i ma własny scenariusz wykonania.Thread.start()
wywołujerun()
metodę asynchronicznie, co zmienia stan nowego wątku na Runnable.Ale
Thread.run()
nie tworzy żadnego nowego wątku. Zamiast tego synchronicznie wykonuje metodę uruchamiania w bieżącym bieżącym wątku.Jeśli używasz
Thread.run()
, to w ogóle nie używasz funkcji wielowątkowości.źródło
invoke
run()
wykonuje się w wątku wywołującym, jak każde inne wywołanie metody. podczas gdyThread.start()
tworzy nowy wątek. wywoływanierun()
to błąd programowy.źródło
Jeśli zrobisz to
run()
w metodzie głównej, wątek metody głównej wywoła tęrun
metodę zamiast wątku, który chcesz uruchomić.start()
Metoda tworzy nowy wątek, dla któregorun()
metoda musi być zrobioneźródło
main
pisarza oznaczało metodę wywoływania. Jego odpowiedź jest całkiem dobra. +1 ;-)t.start()
to metoda zapewniana przez bibliotekę do wywoływania kodu, gdy potrzebny jest nowy wątek.r.run()
Jest to metoda, która Ci przewidywać, że biblioteka zadzwonić w nowym wątku.Większość z tych odpowiedzi nie ma szerszego obrazu, co oznacza, że jeśli chodzi o język Java, nie ma większej różnicy między żadnymi innymi metodami
t.start()
ir.run()
pomiędzy nimi.Obie są tylko metodami. Oba działają w wątku, który je wywołał . Obaj robią wszystko, do czego zostali zakodowani, a potem obaj wracają, wciąż w tym samym wątku, do swoich rozmówców.
Największą różnicą jest to, że większość kodu za
t.start()
to natywny kod, podczas gdy w większości przypadków kodr.run()
będzie czysta Java. Ale to nie jest duża różnica. Kod to kod. Natywny kod jest trudniejszy do znalezienia i trudniejszy do zrozumienia, kiedy go znajdziesz, ale nadal jest to tylko kod, który mówi komputerowi, co ma robić.Co więc robi
t.start()
?Tworzy nowy natywny wątek, organizuje wywołanie tego wątku
t.run()
, a następnie informuje system operacyjny, aby zezwolił na uruchomienie nowego wątku. Potem wraca.I co
r.run()
zrobić?Zabawne jest to, że osoba zadająca to pytanie to osoba, która je napisała .
r.run()
robi wszystko , co Ty (tj. programista, który to napisał) zaprojektował.źródło
Thread.start()
kod rejestruje wątek w programie planującym, a program planujący wywołujerun()
metodę. TakżeThread
klasaRunnable
jest, podczas gdy jest interfejsem.źródło
Punkty, które zrobili członkowie są w porządku, więc chcę tylko coś dodać. Chodzi o to, że JAVA nie obsługuje wielokrotnego dziedziczenia. Ale co jest, jeśli chcesz wyprowadzić klasę B z innej klasy A, ale możesz wyprowadzić tylko z jednej klasy. Problem polega teraz na tym, jak „wyprowadzić” z obu klas: A i Thread. Dlatego możesz użyć interfejsu Runnable.
źródło
Jeśli bezpośrednio wywołujesz
run()
metodę, nie używasz funkcji wielowątkowości, ponieważrun()
metoda jest wykonywana jako część wątku wywołującego.Jeśli wywołasz
start()
metodę na wątku, Java Virtual Machine wywoła metodę run (), a dwa wątki będą działać jednocześnie - bieżący wątek (main()
w twoim przykładzie) i inny wątek (Runnabler1
w twoim przykładzie).Spójrz na kod źródłowy
start()
metody w klasie ThreadW powyższym kodzie nie można zobaczyć wywołania
run()
metodyprivate native void start0()
odpowiada za wywołanierun()
metody. JVM wykonuje tę natywną metodę.źródło
W pierwszym przypadku po prostu wywołujesz
run()
metodę obiektówr1
ir2
.W drugim przypadku tworzysz 2 nowe wątki!
start()
zadzwonirun()
w pewnym momencie!źródło
metoda run: - jest metodą abstrakcyjną utworzoną pierwotnie w interfejsie Runnable i nadpisaną w klasie Thread oraz podklasach Thread (As Thread implementuje Runnable w kodzie źródłowym) i wszelkich innych klasach implementujących Runnable. - Służy do załadowania wątku (obiektu wykonalnego) z zadaniem, które ma wykonać, więc przesłonisz go, aby napisać to zadanie.
metoda początkowa: - jest zdefiniowana w klasie wątków. Kiedy metoda start jest wywoływana na obiekcie wątku 1- , wywołuje wewnętrznie rodzimą metodę (nonjava) o nazwie start0 (); metoda.
start0 (); Metoda: odpowiada za niskie przetwarzanie (tworzenie stosu dla wątku i przydzielanie wątku w kolejce procesora). W tym momencie mamy wątek w stanie Gotowe / Uruchomione.
2- W momencie, gdy program planujący wątek zdecyduje, że wątek wejdzie w rdzeń procesora zgodnie z (priorytet wątku, a także algorytm planowania systemu operacyjnego), na obiekcie Runnable zostaje wywołana metoda uruchamiania (niezależnie od tego, czy jest to bieżący obiekt Thread Runna, czy przekazany obiekt Runnable do konstruktora wątków) tutaj wątek przechodzi w stan Uruchomiony i rozpoczyna wykonywanie swojego zadania (metoda uruchamiania)
źródło
Oddzielne metody start () i run () w klasie Thread zapewniają dwa sposoby tworzenia programów wątkowych. Metoda start () rozpoczyna wykonywanie nowego wątku i wywołuje metodę run (). Metoda start () zwraca natychmiast, a nowy wątek normalnie kontynuuje działanie, aż do powrotu metody run ().
Metoda run () klasy Thread nic nie robi, więc podklasy powinny przesłonić metodę kodem do wykonania w drugim wątku. Jeśli instancja wątku jest tworzona za pomocą argumentu Runnable, metoda run () wątku wykonuje zamiast tego metodę run () obiektu Runnable w nowym wątku.
W zależności od charakteru programu wątkowego bezpośrednie wywołanie metody Thread run () może dać takie same wyniki jak wywołanie za pomocą metody start (), ale w tym drugim przypadku kod jest faktycznie wykonywany w nowym wątku.
źródło
Wywołanie metody Start () metoda przesłonięcia metody klasy rozszerzonej wątku i interfejsu Runnable implementuje interfejs.
Ale wywołując metodę run (), szuka metody run, ale jeśli klasa implementuje interfejs Runnable, wówczas wywołuje metodę run () przesłaniającą metodę Runnable.
dawny.:
`
`
źródło