wird der Hauptthread beendet, bevor die untergeordneten Threads die Ausführung abschließen? [Duplikat]

7

wird der Hauptthread beendet, bevor die untergeordneten Threads die Ausführung abschließen?

ich lese in 2 Artikeln

Ссылка

im obigen Artikel, in "Thread Termination" para, heißt es in Red "wenn der Eltern-Thread endet, werden alle seine Kind-Threads auch beendet."

Ссылка

Im obigen Artikel steht in der letzten Zeile dieser Seite: "Die Ausführung der main () -Methode kann beendet werden, aber das Programm läuft weiter, bis alle Threads die Ausführung abgeschlossen haben.".

ich Gebühr sie sind widersprüchlich. Wenn ich falsch liege, korrigieren bitte Experten mich.

In meinem Programm ruft ein Programm mit der Main-Methode den Konstruktor von 2 Threads auf. im Konstruktor der jeweiligen Threads habe ich die Methode start ().

%Vor%

Ich würde gerne wissen, was passiert, endet der Haupt-Thread vor der Ausführung der untergeordneten Threads? Wenn ja, werden die Kindfäden trotzdem fortfahren, ihre Ausführung fortsetzen?

Ich habe versucht, das Programm auszuführen, manchmal werden alle untergeordneten Threads vollständig ausgeführt, selbst wenn der Hauptthread beendet wird. In den 2 Threads verarbeite ich einige Dateien. In testA thread A allein wird 1 Datei nicht mehrmals verarbeitet. Aber viele Male werden alle Dateien verarbeitet und ich habe keine Probleme.

    
user1257836 11.03.2012, 02:15
quelle

3 Antworten

20

Java unterscheidet zwischen einem Benutzer-Thread und einem anderen Thread-Typ, der als Daemon-Thread bezeichnet wird. Der Unterschied zwischen diesen beiden Typen von Threads besteht darin, dass, wenn die JVM feststellt, dass die einzigen in einer Anwendung ausgeführten Threads Daemon-Threads sind (d. H. Es gibt keine Benutzer-Threads), die Java-Laufzeitumgebung die Anwendung herunter. Wenn mindestens ein Benutzer-Thread aktiv ist, wird die Anwendung durch die Java-Laufzeitumgebung nicht beendet.

Wenn Ihre main () -Methode anfänglich die Kontrolle von der Java-Laufzeitumgebung erhält, wird sie im Kontext eines Benutzer-Threads ausgeführt. Solange der Hauptmethoden-Thread oder ein anderer Benutzer-Thread am Leben bleibt, wird Ihre Anwendung weiterhin ausgeführt.

In Ihrem Fall sind die Threads Benutzer-Threads und dürfen daher abgeschlossen werden, bevor der Haupt-Thread beendet wird.

  

Ich verarbeite einige Dateien. in testA thread A allein, ist 1 Datei allein   einige Male nicht verarbeitet. aber oft

Der Grund für das oben genannte könnte etwas anderes als Thread-Exits sein. Es könnte sich um Dateisperren, Synchronisierungsprobleme usw. handeln.

Aus Java-Thread-API-Dokumentation :

  

Wenn eine Java Virtual Machine gestartet wird, gibt es normalerweise eine einzelne   Nicht-Daemon-Thread (der normalerweise die Methode namens main von einigen aufruft)   designierte Klasse). Die Java Virtual Machine wird weiterhin ausgeführt   Threads, bis einer der folgenden Fälle auftritt:

     

Die Exit-Methode der Klasse Runtime wurde aufgerufen und die Sicherheit   Manager hat erlaubt, dass der Exit-Vorgang stattfindet. Alle Themen   Das sind keine Dämonenthreads, die gestorben sind, entweder durch die Rückkehr von der   Rufen Sie die run-Methode oder eine ausgehende Ausnahme auf   jenseits der Laufmethode.

    
Suresh Kumar 11.03.2012, 02:31
quelle
3

Die Hintergrundthreads werden weiter ausgeführt, auch wenn der MAIN-Thread abgeschlossen ist.

Wenn Sie möchten, dass MAIN sie stoppt (Beispiel, wenn MAIN abgeschlossen ist), setzen Sie Ihre MAIN auf eine Variable, die "läuft" (die Sie als "volatile" einstellen müssen), auf die sich die Threads gelegentlich beziehen. MAIN setzt es auf false (variable) oder null (object), wenn MAIN sie stoppen möchte. Wenn es falsch oder null ist, muss der Thread "zurückgeben".

Dies ist etwas komplex zu implementieren, es gibt viele Möglichkeiten, aber am einfachsten ist es, Ihre Runnable zu einer inneren Klasse zu machen, so dass Ihre Runnable die Flagge einfach teilen kann.

Suchen Sie diese Technik in den Start-Stopp-Routinen der Java-Applets nach den besten Implementierungen.

    
John 30.06.2012 00:05
quelle
2

Sobald der Haupt-Thread beendet ist, nimmt er die Kinder mit. Vielleicht bedeutet "fertig" den zweiten Artikel einfach keine Operation mehr, außer auf die Kinder zu warten. Sobald der Haupt-Thread System.exit (0) aufruft; es ist vorbei - jeder Körper stirbt.

Angenommen, Sie haben zwei Threads ausgeführt: threadA und threadB. in der Hauptmethode. Der erste Code ist der nette Weg, den Thread zu beenden - nur eine von vielen Möglichkeiten:

%Vor%

Unten ist eine abrupte Methode, alle Threads innerhalb von main zu löschen:

%Vor%     
kasavbere 11.03.2012 02:34
quelle

Tags und Links