Страница 398 из 502
<b> Console.WriteLine("В потоке " + Thrd.Name + ", Count = " + Count); </b>
<b> Count++; </b>
<b> } while(Count < 10); </b>
<b> Console.WriteLine(Thrd.Name + " завершен."); </b>
<b> } </b>
<b>} </b>
<b>class MoreThreads { </b>
<b> static void Main() { </b>
<b> Console.WriteLine("Основной поток начат."); </b>
<b> // Сконструировать три потока. </b>
<b> MyThread mt1 = new MyThread("Потомок #1"); </b>
<b> MyThread mt2 = new MyThread("Потомок #2"); </b>
<b> MyThread mt3 = new MyThread("Потомок #3"); </b>
<b> do { </b>
<b> Console.Write("."); </b>
<b> Thread.Sleep(100) ; </b>
<b> } while (mt1.Count <10 ||</b>
<b> mt2.Count <10 ||</b>
<b> mt3.Count < 10); </b>
<b> Console.WriteLine("Основной поток завершен."); </b>
<b> } </b>
<b>} </b>
Ниже приведен один из возможных результатов выполнения этой программы
<b>Основной поток начат.</b>
<b>Потомок #1 начат.</b>
<b>Потомок #2 начат.</b>
<b>Потомок #3 начат.</b>
<b>.....В потоке Потомок #1, Count = 0</b>
<b>В потоке Потомок #2, Count = 0</b>
<b>В потоке Потомок #3, Count = 0</b>
<b>.....В потоке Потомок #1, Count = 1</b>
<b>В потоке Потомок #2, Count = 1</b>
<b>В потоке Потомок #3, Count = 1</b>
<b>.....В потоке Потомок #2, Count = 2</b>
<b>В потоке Потомок #1, Count = 2</b>
<b>В потоке Потомок #3, Count = 2</b>
<b>....В потоке Потомок #3, Count = 3</b>
<b>В потоке Потомок #1, Count = 3</b>
<b>В потоке Потомок #2, Count = 3</b>
<b>.....В потоке Потомок #2, Count = 4</b>
<b>В потоке Потомок #1, Count = 4</b>
<b>В потоке Потомок #3, Count = 4</b>
<b>.....В потоке Потомок #2, Count = 5</b>
<b>В потоке Потомок #3, Count = 5</b>
<b>В потоке Потомок #1, Count = 5</b>
<b>.....В потоке Потомок #3, Count = 6</b>
<b>В потоке Потомок #1, Count = 6</b>
<b>В потоке Потомок #2, Count = 6</b>
<b>....В потоке Потомок #1, Count = 7</b>
<b>В потоке Потомок #2, Count = 7</b>
<b>В потоке Потомок #3, Count = 7</b>
<b>.....В потоке Потомок #3, Count = 8</b>
<b>В потоке Потомок #1, Count = 8</b>
<b>В потоке Потомок #2, Count = 8</b>
<b>.....В потоке Потомок #3, Count = 9</b>
<b>Потомок #3 завершен.</b>
<b>В потоке Потомок #2, Count = 9</b>
<b>Потомок #2 завершен.</b>
<b>В потоке Потомок #1, Count = 9</b>
<b>Потомок #1 завершен.</b>
<b>Основной поток завершен.</b>
Как видите, после того как все три потока начнут выполняться, они будут совместно использовать ЦП. Приведенный выше результат может отличаться в зависимости от среды выполнения, операционной системы и других внешних факторов, влияющих на выполнение программы.
Определение момента окончания потока
Нередко оказывается полезно знать, когда именно завершается поток. В предыдущих примерах программ для этой цели отслеживалось значение переменной Count. Но ведь это далеко не лучшее и не совсем пригодное для обобщения решение. Правда, в классе Thread имеются два других средства для определения момента окончания потока. С этой целью можно, прежде всего, опросить доступное только для чтения свойство IsAlive, определяемое следующим образом.
<b>public bool IsAlive { get; }</b>
Свойство IsAlive возвращает логическое значение true, если поток, для которого оно вызывается, по-прежнему выполняется. Для "опробования" свойства IsAlive подставьте приведенный ниже фрагмент кода вместо кода в классе MoreThread из предыдущей версии многопоточной программы, как показано ниже.
<b>// Использовать свойство IsAlive для отслеживания момента окончания потоков, </b>
<b>class MoreThreads { </b>