Страница 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 + " начат.");</b>
<b> do {</b>
<b> Thread.Sleep(500);</b>
<b> Console.WriteLine("В потоке " + thrdName + ", Count = " + Count);</b>
<b> Count++;</b>
<b> } while (Count < 10);</b>
<b> Console.WriteLine(thrdName + " завершен.");</b>
<b> }</b>
<b>}</b>
<b>class MultiThread {</b>
<b> static void Main() {</b>
<b> Console.WriteLine("Основной поток начат.");</b>
<b> // Сначала сконструировать объект типа MyThread.</b>
<b> MyThread mt = new MyThread("Потомок #1");</b>
<b> // Далее сконструировать поток из этого объекта.</b>
<b> Thread newThrd = new Thread(mt.Run);</b>
<b> // И наконец, начать выполнение потока.</b>
<b> newThrd.Start();</b>
<b> do {</b>
<b> Console.Write(".");</b>
<b> Thread.Sleep(100);</b>
<b> } while (mt.Count != 10);</b>
<b> Console.WriteLine("Основной поток завершен.");</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("Потомок #1");</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>