Метод Join()
ожидает до тех пор, пока поток, для которого он был вызван, не завершится. Его имя отражает принцип ожидания до тех пор, пока вызывающий поток не ThreadStateException
. В других формах метода Join()
можно указать максимальный период времени, в течение которого следует ожидать завершения указанного потока.
В приведенном ниже примере программы метод Join()
используется для того, чтобы основной поток завершился последним.
// Использовать метод Join().
using System;
using System.Threading;
class MyThread {
public int Count;
public Thread Thrd;
public MyThread(string name) {
Count = 0;
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Точка входа в поток,
void Run() {
Console.WriteLine(Thrd.Name + " начат.");
do {
Thread.Sleep(500);
Console.WriteLine ("В потоке " + Thrd.Name +
",
Count = " + Count);
Count++;
} while(Count < 10);
Console.WriteLine(Thrd.Name + " завершен.");
}
}
// Использовать метод Join() для ожидания до тех пор,
// пока потоки не завершатся,
class JoinThreads {
static void Main() {
Console.WriteLine("Основной поток начат.");
// Сконструировать три потока.
MyThread mt1 = new MyThread("Потомок #1");
MyThread mt2 = new MyThread("Потомок #2");
MyThread mt3 = new MyThread("Потомок #3");
mt1.Thrd.Join();
Console.WriteLine("Потомок #1 присоединен.");
mt2.Thrd.Join();
Console.WriteLine("Потомок #2 присоединен.");
mt3.Thrd.Join();
Console.WriteLine("Потомок #3 присоединен.");
Console.WriteLine("Основной поток завершен.");
}
}
Ниже приведен один из возможных результатов выполнения этой программы. Напомним, что он может отличаться в зависимости от среды выполнения, операционной системы и прочих факторов, влияющих на выполнение программы.
Основной поток начат.
Потомок #1 начат.
Потомок #2 начат.
Потомок #3 начат.
В потоке Потомок #1, Count = 0
В потоке Потомок #3, Count = 0
В потоке Потомок #2, Count = 0
В потоке Потомок #3, Count = 1
В потоке Потомок #2, Count = 1
В потоке Потомок #1, Count = 1
В потоке Потомок #1, Count = 2
В потоке Потомок #3, Count = 2
В потоке Потомок #2, Count = 2
В потоке Потомок #2, Count = 3
В потоке Потомок #3, Count = 3
В потоке Потомок #1, Count = 3
В потоке Потомок #3, Count = 4
В потоке Потомок #1, Count = 4
В потоке Потомок #2, Count = 4
В потоке Потомок #3, Count = 5
В потоке Потомок #1, Count = 5
В потоке Потомок #2, Count = 5
В потоке Потомок #2, Count = 6
В потоке Потомок #1, Count = 6
В потоке Потомок #3, Count = 6
В потоке Потомок #2, Count = 7
В потоке Потомок #1, Count = 7
В потоке Потомок #3, Count = 7
В потоке Потомок #2, Count = 8
В потоке Потомок #1, Count = 8
В потоке Потомок #3, Count = 8
В потоке Потомок #2, Count = 9
Потомок #2 завершен.
В потоке Потомок #1, Count = 9
В потоке Потомок #3, Count = 9
Потомок #3 завершен.
Потомок #1 завершен.
Потомок #1 присоединен.
Потомок #2 присоединен.
Потомок #3 присоединен.