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?
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?
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.
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.
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...
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.