В приведенном ниже примере программы создается и начинает выполняться новый поток.
// Создать поток исполнения.
using System;
using System.Threading;
class MyThread {
public int Count;
string thrdName;
public MyThread(string name) {
Count = 0;
thrdName = name;
}
// Точка входа в поток,
public void Run() {
Console.WriteLine(thrdName + " начат.");
do {
Thread.Sleep(500);
Console.WriteLine("В потоке " + thrdName + ", Count = " + Count);
Count++;
} while (Count < 10);
Console.WriteLine(thrdName + " завершен.");
}
}
class MultiThread {
static void Main() {
Console.WriteLine("Основной поток начат.");
// Сначала сконструировать объект типа MyThread.
MyThread mt = new MyThread("Потомок #1");
// Далее сконструировать поток из этого объекта.
Thread newThrd = new Thread(mt.Run);
// И наконец, начать выполнение потока.
newThrd.Start();
do {
Console.Write(".");
Thread.Sleep(100);
} while (mt.Count != 10);
Console.WriteLine("Основной поток завершен.");
}
}
Рассмотрим приведенную выше программу более подробно. В самом ее начале определяется класс MyThread
, предназначенный для создания второго потока исполнения. В методе Run()
этого класса организуется цикл для подсчета от 0 до 9. Обратите внимание на вызов статического метода Sleep()
, определенного в классе Thread
. Этот метод обусловливает приостановление того потока, из которого он был вызван, на определенный период времени, указываемый в миллисекундах. Когда приостанавливается один поток, может выполняться другой. В данной программе используется следующая форма метода Sleep()
:
public static void Sleep(int миллисекунд_простоя)
где
В методе Main()
новый объект типа Thread
создается с помощью приведенной ниже последовательности операторов.
// Сначала сконструировать объект типа MyThread.
MyThread mt = new MyThread("Потомок #1");
// Далее сконструировать поток из этого объекта.
Thread newThrd = new Thread(mt.Run);
// И наконец, начать выполнение потока.
newThrd.Start();
Как следует из комментариев к приведенному выше фрагменту кода, сначала создается объект типа MyThread
. Затем этот объект используется для создания объекта типа Thread
, для чего конструктору этого объекта в качестве точки входа передается метод mt.Run()
. И наконец, выполнение потока начинается с вызова метода Start()
.
Благодаря этому метод mt.Run()
выполняется в своем собственном потоке. После вызова метода Start()
выполнение основного потока возвращается к методу Main()
, где начинается цикл do-while
. Оба потока продолжают выполняться, совместно используя ЦП, вплоть до окончания цикла. Ниже приведен результат выполнения данной программы. (Он может отличаться в зависимости от среды выполнения, операционной системы и степени загрузки задач.)
Основной поток начат.
Потомок #1 начат.
....Потомок #1 Count = 0
....Потомок #1 Count = 1
....Потомок #1 Count = 2
....Потомок #1 Count = 3
....Потомок #1 Count = 4
....Потомок #1 Count = 5
....Потомок #1 Count = 6
....Потомок #1 Count = 7
....Потомок #1 Count = 8
....Потомок #1 Count = 9
Потомок #1 завершен.
Основной поток завершен.