Добавить в цитаты Настройки чтения

Страница 398 из 502

<b>      Console.WriteLine(&quot;В потоке &quot; + Thrd.Name + &quot;, Count = &quot; + Count); </b>

<b>      Count++; </b>

<b>    } while(Count &lt; 10); </b>

<b>    Console.WriteLine(Thrd.Name + &quot; завершен.&quot;); </b>

<b>  } </b>

<b>} </b>

<b>class MoreThreads { </b>

<b>  static void Main() { </b>

<b>    Console.WriteLine(&quot;Основной поток начат.&quot;); </b>

<b>    // Сконструировать три потока. </b>

<b>    MyThread mt1 = new MyThread(&quot;Потомок #1&quot;); </b>

<b>    MyThread mt2 = new MyThread(&quot;Потомок #2&quot;); </b>

<b>    MyThread mt3 = new MyThread(&quot;Потомок #3&quot;); </b>

<b>    do { </b>

<b>      Console.Write(&quot;.&quot;); </b>

<b>      Thread.Sleep(100) ; </b>

<b>    } while (mt1.Count &lt;10 ||</b>

<b>             mt2.Count &lt;10 ||</b>

<b>             mt3.Count &lt; 10); </b>

<b>    Console.WriteLine(&quot;Основной поток завершен.&quot;); </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>