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

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

В приведенном ниже примере программы создается и начинает выполняться новый поток.

<b>// Создать поток исполнения.</b>

<b>using System;</b>

<b>using System.Threading;</b>

<b>class MyThread {</b>

<b>  public int Count;</b>

<b>  string thrdName;</b>

<b>  public MyThread(string name) {</b>

<b>    Count = 0;</b>

<b>    thrdName = name;</b>

<b>  }</b>

<b>  // Точка входа в поток,</b>

<b>  public void Run() {</b>

<b>    Console.WriteLine(thrdName + &quot; начат.&quot;);</b>

<b>    do {</b>

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

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

<b>      Count++;</b>

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

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

<b>  }</b>

<b>}</b>

<b>class MultiThread {</b>

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

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

<b>    // Сначала сконструировать объект типа MyThread.</b>

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

<b>    // Далее сконструировать поток из этого объекта.</b>

<b>    Thread newThrd = new Thread(mt.Run);</b>

<b>    // И наконец, начать выполнение потока.</b>

<b>    newThrd.Start();</b>

<b>    do {</b>

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

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

<b>    } while (mt.Count != 10);</b>

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

<b>  }</b>

<b>}</b>

Рассмотрим приведенную выше программу более подробно. В самом ее начале определяется класс MyThread, предназначенный для создания второго потока исполнения. В методе Run() этого класса организуется цикл для подсчета от 0 до 9. Обратите внимание на вызов статического метода Sleep(), определенного в классе Thread. Этот метод обусловливает приостановление того потока, из которого он был вызван, на определенный период времени, указываемый в миллисекундах. Когда приостанавливается один поток, может выполняться другой. В данной программе используется следующая форма метода Sleep():

<b>public static void Sleep(int миллисекунд_простоя)</b>

где миллисекунд_простоя обозначает период времени, на который приостанавливается выполнение потока. Если указанное количество миллисекунд_простоя равно нулю, то вызывающий поток приостанавливается лишь для того, чтобы предоставить возможность для выполнения потока, ожидающего своей очереди.

В методе Main() новый объект типа Thread создается с помощью приведенной ниже последовательности операторов.

<b>// Сначала сконструировать объект типа MyThread.</b>

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

<b>// Далее сконструировать поток из этого объекта.</b>

<b>Thread newThrd = new Thread(mt.Run);</b>

<b>// И наконец, начать выполнение потока.</b>

<b> newThrd.Start();</b>

Как следует из комментариев к приведенному выше фрагменту кода, сначала создается объект типа MyThread. Затем этот объект используется для создания объекта типа Thread, для чего конструктору этого объекта в качестве точки входа передается метод mt.Run(). И наконец, выполнение потока начинается с вызова метода Start().

Благодаря этому метод mt.Run() выполняется в своем собственном потоке. После вызова метода Start() выполнение основного потока возвращается к методу Main(), где начинается цикл do-while. Оба потока продолжают выполняться, совместно используя ЦП, вплоть до окончания цикла. Ниже приведен результат выполнения данной программы. (Он может отличаться в зависимости от среды выполнения, операционной системы и степени загрузки задач.)

<b>Основной поток начат. </b>

<b>Потомок #1 начат. </b>

<b>....Потомок #1 Count = 0 </b>

<b>....Потомок #1 Count = 1 </b>

<b>....Потомок #1 Count = 2 </b>

<b>....Потомок #1 Count = 3 </b>

<b>....Потомок #1 Count = 4 </b>