wake-up-neo.com

Was ist der Unterschied zwischen Thread start () und Runnable run ()

Angenommen, wir haben diese beiden Runables:

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

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

Was ist dann der Unterschied zwischen:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

Und das:

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

Erstes Beispiel: Keine mehreren Threads. Beide werden in einem einzigen (vorhandenen) Thread ausgeführt. Keine Thread-Erstellung.

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

r1 Und r2 Sind nur zwei verschiedene Objekte von Klassen, die die Schnittstelle Runnable und damit die Methode run() implementieren. Wenn Sie r1.run() aufrufen, führen Sie es im aktuellen Thread aus.

Zweites Beispiel: Zwei separate Threads.

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

t1 Und t2 Sind Objekte der Klasse Thread . Wenn Sie t1.start() aufrufen, wird ein neuer Thread gestartet und die run() -Methode von r1 Intern aufgerufen, um sie in diesem neuen Thread auszuführen.

292
Bhesh Gurung

Wenn Sie run() nur direkt aufrufen, wird es im aufrufenden Thread wie jeder andere Methodenaufruf ausgeführt. Thread.start() ist erforderlich, um tatsächlich einen neuen Thread zu erstellen, damit die run -Methode des Runnable parallel ausgeführt wird.

89
Mike Daniels

Der Unterschied besteht darin, dass Thread.start() einen Thread startet, der die run() -Methode aufruft, während Runnable.run() nur die run() -Methode für den aktuellen Thread aufruft.

66
user207421

DerUnterschiedist, dass, wenn das Programm die Methode start() aufruft, einnew-Thread erstellt und darin codiert wird run() wird innewthread ausgeführt, während wenn Sie run() method direkt aufrufenno newthread wird erstellt und der Code in run() wird direkt im aktuellen Thread ausgeführt.

Ein weitererUnterschiedzwischen start() und run() in Java ist, dass Siekönnen nichtzweimal start() aufrufen. Nach dem Start wirft der zweite Aufruf von start()IllegalStateException in Java, während Sie die Methode run() mehrmals aufrufen können, da sie nur einist/gewöhnlicheMethode.

30
Jaimin Patel

Tatsächlich erstellt Thread.start() einen neuen Thread und verfügt über ein eigenes Ausführungsszenario.

Thread.start() ruft die Methode run() asynchron auf, wodurch der Status des neuen Threads in Runnable geändert wird.

Aber Thread.run() erstellt keinen neuen Thread. Stattdessen wird die run-Methode im aktuell ausgeführten Thread synchron ausgeführt.

Wenn Sie Thread.run() verwenden, verwenden Sie die Funktionen von Multi-Threading überhaupt nicht.

22
aditya

invoke run() wird wie jeder andere Methodenaufruf im aufrufenden Thread ausgeführt. wohingegen Thread.start() einen neuen Thread erzeugt. Das Aufrufen von run() ist ein programmatischer Fehler.

8
Narendra Jaggi

Wenn Sie in der Hauptmethode run() ausführen, ruft der Thread der Hauptmethode anstelle des auszuführenden Threads die Methode run auf.

Die Methode start() erstellt einen neuen Thread, für den die Methode run() ausgeführt werden muss

6
Rohith

Der Code Thread.start() registriert den Thread beim Scheduler und der Scheduler ruft die Methode run() auf. Außerdem ist Thread eine Klasse, während Runnable eine Schnittstelle ist.

5
CHANDRAHAS

Die meisten dieser Antworten verpassen das Gesamtbild, dh, was die Java Sprache betrifft, gibt es keinen Unterschied mehr zwischen t.start() und r.run() als es zwischen zwei anderen Methoden gibt.

Sie sind beide nur Methoden. Beide laufen in dem Thread, der sie aufgerufen hat. Sie tun beide, wozu sie programmiert wurden, und kehren dann beide, immer noch im selben Thread, zu ihren Anrufern zurück.

Der größte Unterschied besteht darin, dass der größte Teil des Codes für t.start()native ist, während der Code für r.run() in den meisten Fällen reines Java ist. Aber das ist kein großer Unterschied. Code ist Code. Nativer Code ist schwerer zu finden und schwer zu verstehen, wenn Sie ihn finden, aber es ist immer noch nur Code, der dem Computer sagt, was zu tun ist.

Also, was macht t.start()?

Es erstellt einen neuen systemeigenen Thread, veranlasst, dass dieser Thread t.run() aufruft, und weist dann das Betriebssystem an, den neuen Thread ausführen zu lassen. Dann kehrt es zurück.

Und was macht r.run()?

Das Lustige ist, die Person, die diese Frage stellt, ist die Person, die schrieb es. r.run() macht das, wofür Sie (d. h. der Entwickler, der es geschrieben hat).


t.start() ist die Methode, mit der die Bibliothek Ihren Code aufruft, wenn Sie einen neuen Thread wünschen.

r.run() ist die Methode, die Sie für die Bibliothek bereitstellt, um in den neuen Thread aufzurufen.

4
Solomon Slow

Die Punkte, die die Mitglieder gemacht haben, sind in Ordnung, also möchte ich nur etwas hinzufügen. Die Sache ist, dass Java unterstützt keine Mehrfachvererbung. Aber was ist, wenn Sie eine Klasse B von einer anderen Klasse A ableiten möchten, aber Sie können nur von einer Klasse ableiten. Das Problem ist jetzt, wie um von beiden Klassen "abzuleiten": A und Thread. Daher können Sie das Runnable Interface verwenden.

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

public class B extends A implements Runnable{...
3
pommoisel

Wenn Sie die Methode run() direkt aufrufen, verwenden Sie die Multithreading-Funktion nicht, da die Methode run() als Teil des Aufruferthreads ausgeführt wird.

Wenn Sie die Methode start() in Thread aufrufen, ruft die Java) Virtual Machine die Methode run () auf und zwei Threads werden gleichzeitig ausgeführt - Current Thread (main() in Ihrem Beispiel) und Other Thread (Runnable r1 in Ihrem Beispiel).

Schauen Sie sich den Quellcode der start() -Methode in Thread-Klasse an

 /**
     * 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();

Im obigen Code können Sie den Aufruf der run() -Methode nicht sehen.

private native void start0() ist für den Aufruf der Methode run() verantwortlich. JVM führt diese native Methode aus.

2
Ravindra babu

Im ersten Fall rufen Sie einfach die run() -Methode der Objekte r1 Und r2 Auf.

Im zweiten Fall erstellen Sie tatsächlich 2 neue Threads!

start() ruft irgendwann run() auf!

1
Gevorg