Нередко оказывается полезно знать, когда именно завершается поток. В предыдущих примерах программ для этой цели отслеживалось значение переменнойCount.Но ведь это далеко не лучшее и не совсем пригодное для обобщения решение. Правда, в классеThreadимеются два других средства для определения момента окончания потока. С этой целью можно, прежде всего, опросить доступное только для чтения свойствоIs Alive,определяемое следующим образом.
public bool IsAlive { get; }
СвойствоIsAliveвозвращает логическое значениеtrue,если поток, для которого оно вызывается, по-прежнему выполняется. Для "опробования" свойстваIsAliveподставьте приведенный ниже фрагмент кода вместо кода в классеMore Threadиз предыдущей версии многопоточной программы, как показано ниже.
// Использовать свойство IsAlive для отслеживания момента окончания потоков, class MoreThreads { static void Main() {
Console.WriteLine("Основной поток начат.");
// Сконструировать три потока.
do {
Console.Write(".");
Thread.Sleep(100);
} while (mtl.Thrd.IsAlive && mt2.Thrd.IsAlive && mt3.Thrd.IsAlive);
Console.WriteLine("Основной поток завершен.");
}
}
При выполнении этой версии программы результат получается таким же, как и прежде. Единственное отличие заключается в том, что в ней используется свойство IsAlive для отслеживания момента окончания порожденных потоков.
Еще один способ отслеживания момента окончания состоит в вызове метода Join (). Ниже приведена его простейшая форма.
public void Join()
Метод 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++;
} Vhile(Count < 10);
Console.WriteLine(Thrd.Name + " завершен.");
}
}
// Использовать метод Join() для ожидания до тех пор,