Bitte erläutern Sie die Ausgabe von Thread run () und start () Methoden

8

Bitte erläutern Sie die Ausgabe des folgenden Codes:

Wenn ich th1.run() aufrufe, lautet die Ausgabe:

%Vor%

Wenn ich th1.start() aufrufe, lautet die Ausgabe:

%Vor%

Warum diese Inkonsistenz? Bitte erläutern.

%Vor%     
JavaUser 12.06.2010, 04:32
quelle

4 Antworten

7

Die Methode Thread.start() startet einen neuen Thread, der Einstiegspunkt für diesen Thread ist die Methode run() . Wenn Sie run () direkt aufrufen, wird es im selben Thread ausgeführt. Da der Aufruf von Thread.start() einen neuen Ausführungsthread startet, kann die Methode run() aufgerufen werden, nachdem (wie in Ihrem Beispiel) der Rest der Hauptmethode ausgeführt wird.

Ändern Sie Ihre Hauptmethode, um th1.start() aufzurufen, und führen Sie sie wiederholt aus. Sie werden sehen, dass sie manchmal Folgendes ausgibt:

%Vor%

und manchmal gibt es aus:

%Vor%

abhängig davon, wie java Ihre 2 Threads plant.

Sehen Sie sich das Java-Tutorial zu diesem Thema an.

    
krock 12.06.2010, 04:37
quelle
3

Wenn Sie th1.run() aufrufen, führen Sie die Methode run im aktuellen Thread aus, also muss dies vor dem Aufruf von th2.run() geschehen.

Wenn Sie th1.start() aufrufen, wird die Methode run für einen neuen Thread aufgerufen. In diesem Fall geschieht dies nach dem Aufruf von th2.run() . (Tatsächlich ist es theoretisch möglich, dass dies vor der th2.run() ... passieren könnte, aber aktuelle und vorherige Sun-Implementierungen von thread.start() bewirken nicht, dass der aktuelle Thread sofort dem neuen Thread "nachgibt".)

Dies zeigt einen häufigen Fehler bei der Verwendung von Java-Threads. Wenn Sie Inhalte für einen neuen Thread ausführen möchten, müssen Sie thread.start() aufrufen. Der direkte Aufruf von thread.run() ist fast immer ein Fehler.

    
Stephen C 12.06.2010 04:42
quelle
0

Wenn Sie .run() aufrufen, wird die Methode aufgerufen und der darin enthaltene Code wird wie jede andere Methode ausgeführt. Wenn Sie .start() für einen Thread aufrufen, wird die run() -Methode in diesem Thread und nicht sequenziell im Hauptthread ausgeführt.

Wenn Sie also th1.start() aufrufen, wird Code in zwei Threads gleichzeitig ausgeführt: Der Hauptthread erstellt dann th2 und ruft dann die Methode run auf, während der th1-Thread seine eigene run aufruft. Methode. Es gibt keine Garantie für die Reihenfolge dieser, da sie parallel ausgeführt werden.

    
Chris 12.06.2010 04:40
quelle
0

das Ausführen von run() ist synchron - Ausführen von start() ist asynchron.

Die Aufrufe von run() sind nur ein regulärer synchroner Methodenaufruf, und sie finden in dieser Reihenfolge statt. Mit th1.start() wird ein neuer Thread gestartet - es ist jetzt ein Zwei-Pferde-Rennen - die beiden Run-Methoden werden jetzt unabhängig voneinander ausgeführt - der erste gewinnt, und es gibt keine Garantie für die Reihenfolge.

Aber wenn die Bestellung nicht garantiert ist, warum druckt der neue Thread die meiste Zeit später? In der Praxis dauert es einige Zeit, um einen neuen Thread zu starten. Zum Zeitpunkt des Starts ist die andere run() -Methode bereits ausgeführt worden. Selbst auf einer Multi-Core-Maschine, bei der beide Threads gleichzeitig ausgeführt werden können, wird der neue Thread in der Regel zuletzt ausgeführt, da der Thread-Start mehr Arbeit erfordert.

    
mdma 13.06.2010 01:53
quelle

Tags und Links