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:
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.
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.
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.
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.
Tags und Links java multithreading