7 Stimmen

Thread.Join vs Thread.State

Thread.Join gibt uns zurück, ob der Thread abgeschlossen hat. Das Gleiche können wir mit ThreadState feststellen. Was ist dann der Unterschied zwischen Thread.Join() und Thread.ThreadState?

Können wir sie austauschbar verwenden?

14voto

JaredPar Punkte 699699

Der Unterschied zwischen Join und dem manuellen Betrachten von ThreadState besteht darin, dass Join eine blockierende Operation ist. Die Funktion gibt erst zurück, wenn das Timeout erreicht ist oder der Ziel-Thread abgeschlossen ist. Das Überprüfen des ThreadState ist eher eine Betrachtungsoperation.

6voto

NG. Punkte 21987

Thread.join WARTET darauf, dass der Thread abgeschlossen wird. ThreadState gibt nur eine Momentaufnahme des Threads zurück, ohne zu warten. Es gibt auch eine Variante von Thread.join, die eine Wartezeit akzeptiert. ThreadState und Join sind extrem unterschiedlich und ich glaube nicht, dass sie austauschbar verwendet werden können.

Versuche einen Test zu machen, bei dem du beide Aufrufe auf einem Thread mit einer Endlosschleife ausführst.

3voto

Cipi Punkte 10767

Wenn Sie Thread.Join() aufrufen, blockiert es den Aufruferthread, bis der Thread, der die Join-Methode hat, abgeschlossen ist. Wenn er abgebrochen oder erfolgreich abgeschlossen ist, wird Join(), die folgt, den Aufruferthread nicht blockieren. Dies ermöglicht es Ihnen, 10 Worker-Threads und einen Hauptthread zu haben, dessen Operation erst nach Abschluss aller 10 Threads ausgeführt werden muss. Sie können also Join() auf dem ersten Thread aufrufen. Dieser Aufruf blockiert den Hauptthread, bis der erste Arbeits-Thread abgeschlossen ist. Danach können Sie Join() auf dem zweiten Thread aufrufen und so weiter, bis Sie zum Thread Nr. 10 gelangen. Wenn Sie darauf Join() aufrufen und der Hauptthread fortgesetzt wird, können Sie sicher sein, dass alle 10 Threads abgeschlossen sind und der Hauptthread seine Operation fortsetzen kann.

Zum Beispiel:

Thread workers[] = new Thread[10];

//*** Threads erstellen und starten ***

foreach(Thread worker in workers)
{
    worker.Join();
}

//Alle Threads sind abgeschlossen, jetzt kann diese Operation fortgesetzt werden...

Andererseits gibt Thread.ThreadState nur den Thread-Status (Aborted, Running, ...) zurück, ohne den Zustand des Aufruferthreads zu beeinflussen (nicht wie Join, das den Aufruferthread in den WaitSleepJoin-Zustand versetzt). Dies dient nur dazu, um den Status des Threads zu überprüfen und eine bestimmte Aktion durchzuführen oder Ihren eigenen Join-Mechanismus zu implementieren, usw...

0voto

Hiber Punkte 464

Thread.Join wird den aufrufenden Thread blockieren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X