Jaka jest różnica między thread start () a Runnable run()

Powiedzmy, że mamy te dwa Runnables:

class R1 implements Runnable {
    public void run() { … }
    …
}

class R2 implements Runnable {
    public void run() { … }
    …
}

Więc 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();
}
Author: Gray, 2011-12-20

15 answers

Pierwszy przykład: brak wielu wątków. Oba uruchamiają się w jednym (istniejącym) wątku. Brak tworzenia wątków.

R1 r1 = new R1();
R2 r2 = new R2();

r1 i r2 są tylko dwoma różnymi obiektami klas, które implementują interfejs Runnable i tym samym implementują metodę run(). Gdy wywołujesz r1.run(), wykonujesz go w bieżącym wątku.

Drugi przykład: dwa oddzielne wątki.

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1 i {[8] } są obiektami klasy Thread. When you call t1.start(), uruchamia nowy wątek i wywołuje wewnętrznie metodę run() z r1, aby wykonać ją w nowym wątku.

 320
Author: Bhesh Gurung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-18 11:03:16

Jeśli wywołasz bezpośrednio run(), zostanie ono wykonane w wątku wywołującym, tak jak każde inne wywołanie metody. Thread.start() jest wymagane, aby utworzyć nowy wątek, tak aby Metoda run runnable była wykonywana równolegle.

 95
Author: Mike Daniels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-20 17:51:18

Różnica polega na tym, że Thread.start() uruchamia wątek, który wywołuje metodę run(), podczas gdy Runnable.run() po prostu wywołuje metodę run() w bieżącym wątku.

 75
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 06:52:04

Różnica polega na tym, że gdy program wywoła metodę start(), tworzony jest nowy wątek, A kod wewnątrz run() jest wykonywany w nowym wątku: podczas gdy jeśli wywołasz metodę run() bezpośrednio, żaden nowy wątek nie zostanie utworzony, a kod wewnątrz run() będzie wykonywany bezpośrednio w bieżącym wątku.

Inną różnicą między start() i run() w wątku Java jest to, że nie można dwukrotnie wywołać start(). Po uruchomieniu drugie wywołanie start() rzuci IllegalStateException w Javie, podczas gdy można wywołać metodę run() kilka czasy, odkąd to zwykła metoda.

 36
Author: Jaimin Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-09 23:56:38

Faktycznie Thread.start() tworzy nowy wątek i ma własny scenariusz wykonania.

Thread.start() wywołuje asynchronicznie metodę run(), która zmienia stan nowego wątku na Runnable.

Ale Thread.run() nie tworzy żadnego nowego wątku. Zamiast tego uruchamia metodę run w bieżącym wątku synchronicznie.

Jeśli używasz Thread.run(), to w ogóle nie używasz funkcji wielowątkowości.

 21
Author: aditya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 14:12:40

Invoke run() jest wykonywane w wątku wywołującym, jak każde inne wywołanie metody. natomiast Thread.start() tworzy nowy wątek. wywołanie run() jest błędem programowym.

 8
Author: Narendra Jaggi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 15:01:51

Jeśli wykonasz run() w metodzie main, wątek metody main wywoła metodę run zamiast wątku wymaganego do uruchomienia.

Metoda start() tworzy nowy wątek, dla którego należy wykonać metodę run()

 7
Author: Rohith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 05:41:59

t.start() jest metodą, którą biblioteka zapewnia wywołanie kodu, gdy chcesz utworzyć nowy wątek.

r.run() jest metodą, którą ty zapewniasz biblioteka do wywołania W nowy wątek.


Większość z tych odpowiedzi pomija szerszą perspektywę, która polega na tym, że jeśli chodzi o język Java, nie ma większej różnicy między t.start() a r.run() Niż pomiędzy jakimikolwiek innymi metodami.

To tylko metody. Oni oba działają w wątku, który je wywołał. Oboje robią to, do czego zostali zaszyfrowani, a potem oboje wracają, wciąż w tym samym wątku, do swoich rozmówców.

Największa różnica polega na tym, że większość kodu t.start() to kod natywny , podczas gdy w większości przypadków kod r.run() będzie czystą Javą. Ale to nie jest wielka różnica. Kod to kod. Natywny kod jest trudniejszy do znalezienia i trudniejszy do zrozumienia, gdy go znajdziesz, ale nadal jest to tylko kod, który mówi komputer co robić.

Więc co robi t.start()?

Tworzy nowy natywny wątek, organizuje, aby ten wątek wywołał t.run(), a następnie mówi systemowi, aby pozwolił nowemu wątkowi działać. Potem wraca.

A co robi r.run()?

Najzabawniejsze jest to, że osoba zadająca to pytanie to osoba, która to napisała. r.run() robi cokolwiek ty (tj. deweloper, który go napisał) zaprojektowane to zrobić.
 5
Author: Solomon Slow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-15 00:21:36

Thread.start() kod rejestruje wątek za pomocą schedulera, a scheduler wywołuje metodę run(). Ponadto, {[2] } jest klasą, podczas gdy {[3] } jest interfejsem.

 4
Author: CHANDRAHAS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-21 09:38:42

Punkty, że członkowie wykonane są w porządku, więc chcę tylko dodać coś. Chodzi o to, że JAVA nie obsługuje wielu dziedziczeń. Ale co jest, jeśli chcesz czerpać klasę B z innej klasy A, ale możesz czerpać tylko z jednej klasy. Problem polega teraz na tym, jak "czerpać" z obu klas: A i Thread. Dlatego możesz użyć interfejsu Runnable.

public class ThreadTest{
   public void method(){
      Thread myThread = new Thread(new B());
      myThread.start;
   }
}

public class B extends A implements Runnable{...
 3
Author: pommoisel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-21 17:53:30

Jeśli bezpośrednio wywołujesz metodę run(), nie używasz funkcji wielowątkowej, ponieważ metoda run() jest wykonywana jako część wątku wywołującego.

Jeśli wywołasz metodę start() w wątku, wirtualna maszyna Javy wywoła metodę run() i dwa wątki będą działać jednocześnie-bieżący wątek (main() w twoim przykładzie) i inny wątek (Runnable r1 w twoim przykładzie).

Spójrz na kod źródłowy metody start() w klasie Thread

 /**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * <p>
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the
     * <code>start</code> method) and the other thread (which executes its
     * <code>run</code> method).
     * <p>
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */
    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();
        group.add(this);
        start0();
        if (stopBeforeStart) {
            stop0(throwableFromStop);
        }
    }

    private native void start0();

W powyższym kodzie nie możesz patrz wywołanie do metody run().

private native void start0() jest odpowiedzialny za wywołanie metody run(). JVM wykonuje tę natywną metodę.

 1
Author: Ravindra babu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 09:02:06

W pierwszym przypadku wywołujesz tylko metodę run() obiektów r1 i r2.

W drugim przypadku tworzysz 2 nowe wątki!

start() zadzwoni run() w pewnym momencie!

 0
Author: Marsellus Wallace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-04 17:16:46

Metoda Run: - jest abstrakcyjną metodą pierwotnie utworzoną w interfejsie Runnable i nadpisaną w klasie Thread, a także podklasach Thread (jako że Thread implementuje Runnable w swoim kodzie źródłowym) i wszelkich innych klasach implementujących interfejs Runnable. - Służy do załadowania wątku (obiektu runnable) z zadaniem, które ma wykonać w ten sposób można nadpisać go do napisania tego zadania.

Metoda startu: - jest zdefiniowana w klasie Thread. Gdy metoda start jest wywoływana na Obiekt wątku 1- wywołuje wewnętrznie natywną (nonjava) metodę o nazwie start0 ();.

Start0 (); Metoda: jest odpowiedzialny za niskie przetwarzanie (tworzenie stosu dla wątku i przydzielanie wątku w kolejce procesora) w tym momencie mamy wątek w stanie Ready / Runnable.

2- w momencie, gdy scheduler wątku decyduje, że wątek wchodzi w rdzeń PROCESORA (priorytet wątku, a także algorytm harmonogramowania OS), metoda run jest wywoływana na Obiekt Runnable (niezależnie od tego, czy jest to bieżący obiekt runnable thread, czy obiekt runnable przekazany do konstruktora wątku) tutaj wątek wchodzi w stan działania i zaczyna wykonywać swoje zadanie (metoda run)

 0
Author: Esraa Salama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-31 19:19:41

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() powraca natychmiast, a nowy wątek normalnie trwa, dopóki metoda run() nie powróci.

Metoda run() klasy wątku nic nie robi, więc podklasy powinny nadpisać metodę kodem do wykonania w drugim wątku. Jeśli wątek jest utworzony z Runnable argument, metoda run () wątku wykonuje zamiast tego metodę run() obiektu Runnable w nowym wątku.

W zależności od charakteru programu z wątkiem, wywołanie metody run () wątku bezpośrednio może dać taki sam wynik jak wywołanie metody start (), ale w tym drugim przypadku kod jest faktycznie wykonywany w nowym wątku.

 -2
Author: gtzinos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 07:08:26

Start () wywołanie metody run override metoda rozszerzonej klasy wątku i implementuje interfejs Runnable.

Ale wywołując run() szuka metody run, ale jeśli implementuje interfejs Runnable, to wywołuje run () nadpisuje metodę Runnable.

Ex.:

`

public class Main1
{
A a=new A();
B b=new B();
a.run();//This call run() of Thread because run() of Thread only call when class 
        //implements with Runnable not when class extends Thread.
b.run();//This not run anything because no run method found in class B but it 
        //didn't show any error.

a.start();//this call run() of Thread
b.start();//this call run() of Thread
}

class A implements Runnable{
@Override
    public void run() {
            System.out.println("A ");
    }
}

class B extends Thread {

    @Override
    public void run() {
            System.out.println("B ");
    }
}

`

 -2
Author: ankit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 11:43:56