Kiedy nazwałbyś Java thread.run()
zamiast thread.start()
?
java
multithreading
concurrency
pusty
źródło
źródło
t.run()
kiedy chcesz uruchomićt
zadanie w bieżącym wątku it.start()
kiedy chcesz uruchomićt
zadanie wt
samym wątku . A może pytasz o rzeczywiste przypadki użycia?start()
! Tak jak ja ... Ta metoda nie powinna być publiczna!Odpowiedzi:
Możesz chcieć wywołać metodę run () w konkretnym teście jednostkowym, który dotyczy wyłącznie funkcjonalności, a nie współbieżności.
źródło
Nigdy. Bezpośrednie wywołanie run () po prostu wykonuje kod synchronicznie (w tym samym wątku), tak jak zwykłe wywołanie metody.
źródło
Zaczerpnięte z często zadawanych pytań dotyczących wątków Java Style Code :
źródło
thread's run() method executes the run() method of the Runnable object in the new thread instead.
To nieprawda (a przynajmniej mój kod źródłowy Java 8 mówi inaczej), ale niestety link wydaje się uszkodzony, więc zamiast tego zgłaszam błąd tutaj.thread.run()
zamiast tego zadzwonimythread.start()
.Wykonywanie
thread.run()
nie tworzy nowego,Thread
w którym kod zostanie wykonany. Po prostu wykonuje kod w bieżącym wątku, z któregothread.run()
kod jest wywoływany.Wykonanie
thread.start()
tworzy nowy wątek na poziomie systemu operacyjnego, w którymrun()
metoda jest wywoływana.W istocie:
Ponadto, jak wspomnieli inni, „testowanie” wydaje się być jedynym wskazanym przypadkiem, w którym można wywołać
run()
bezpośrednio z kodu.źródło
Wspomniano już o tym, ale dla jasności: tworzenie nowego obiektu Thread tylko w celu wywołania metody run () jest niepotrzebnie kosztowne i powinno być główną czerwoną flagą. Byłoby znacznie lepszym, bardziej odsprzężonym projektem, aby utworzyć Runnable impl i albo (a) wywołać jego metodę run () bezpośrednio, jeśli jest to pożądane zachowanie, albo (b) skonstruować nowy Thread z tym Runnable i uruchomić Thread.
Jeszcze lepiej, aby uzyskać jeszcze większe oddzielenie, sprawdź
Executor
interfejs i framework w JDK 5 i nowszych. Pozwala to, w skrócie, oddzielić wykonanie zadania (wystąpienie Runnable) od sposobu jego wykonywania (implementacja Executor, która może wykonać Runnable w bieżącym wątku, w nowym wątku, używając istniejącego wątku z puli, i co innego).źródło
Zadzwoń
thread.start()
, to z kolei zadzwonithread.run()
. Nie mogę wymyślić przypadku, w którym chciałbyś ominąćthread.start()
i przejść bezpośrednio dothread.run()
źródło
Oddzielne metody
start()
irun()
w klasie Thread zapewniają dwa sposoby tworzenia programów z wątkami.start()
Metoda rozpoczyna realizację nowego wątku i wywołujerun()
metodę.start()
Metoda zwraca natychmiast i nowy wątek zazwyczaj trwa dorun()
powrotów metod.Metoda klasy Thread
run()
nic nie robi, więc podklasy powinny przesłonić metodę kodem do wykonania w drugim wątku. Jeśli wystąpienie Thread jest tworzone z argumentem Runnable,run()
metoda wątku wykonujerun()
zamiast tego metodę obiektu Runnable w nowym wątku.W zależności od rodzaju programu z wątkami
run()
, bezpośrednie wywołanie metody Thread może dać takie same wyniki, jak wywołaniestart()
metody, ale w tym drugim przypadku kod jest faktycznie wykonywany w nowym wątku.odniesienie
źródło
The start() method returns immediately and the new thread normally continues until the run() method returns.
Jeślistart()
wróci natychmiast, dlaczegorun()
nadal działa, biorąc pod uwagę, że został wywołany odstart()
Jeśli pytanie brzmiało - „dlaczego metoda uruchamiania wątku jest wywoływana zamiast bezpośrednio uruchamiania metody”, to odpowiadałem za pomocą przykładowego kodu poniżej. Mam nadzieję, że to wyjaśnia. W poniższym przykładzie:
źródło
Kiedy chcesz, aby działał synchronicznie. Wywołanie metody run w rzeczywistości nie zapewni wielowątkowości. Metoda start tworzy nowy wątek, który wywołuje metodę run.
źródło
Jeśli chcesz wykonać zawartość run () tak, jak każdej innej metody. Oczywiście, żeby nie rozpoczynać wątku.
źródło
Zakładając, że znasz sposób użycia metody start and run, tj. Synchroniczna i asynchroniczna; run można użyć tylko do przetestowania funkcjonalności.
Ponadto w pewnych okolicznościach ta sama klasa wątku może być używana w dwóch różnych miejscach z wymaganiami dotyczącymi funkcji synchronizacji i asynchronizacji, mając dwa różne obiekty z jedną metodą uruchamiania i wywoływaną metodą startową innej.
źródło
Przynajmniej w JVM 1.6. Jest trochę sprawdzania i uruchamiania nazywa się natywnie:
źródło
Tylko uwaga do powyższych świetnych komentarzy: czasami piszesz kod wielowątkowy, który używa metody "start" do uruchamiania różnych wątków. O wiele łatwiej będzie, jeśli użyjesz „run” (zamiast „start) do debugowania, ponieważ znacznie ułatwia to synchroniczne uruchamianie kodu i debugowanie.
źródło
źródło