// пока потоки не завершатся, class JoinThreads { static void Main() {
Console.WriteLine("Основной поток начат.");
// Сконструировать три потока.
mtl.Thrd.Join();
Console.WriteLine("Потомок #1 присоединен."); mt2.Thrd.Join();
Console.WriteLine("Потомок #2 присоединен."); mt3.Thrd.Join();
Console.WriteLine("Потомок #3 присоединен.");
Console.WriteLine("Основной поток завершен.");
}
}
Ниже приведен один из возможных результатов выполнения этой программы. Напомним, что он может отличаться в зависимости от среды выполнения, операционной системы и прочих факторов, влияющих на выполнение программы.
Основной поток начат.
Потомок #1 начат. •
Потомок #2 начат.
Потомок #3 начат.
в
потоке
Потомок
#3,
Count
=
3
в
потоке
Потомок
#1,
Count
=
4
в
потоке
Потомок
#2,
Count
=
4
в
потоке
Потомок
#3,
Count
=
4
в
потоке
Потомок
#1,
Count
=
5
в
потоке
Потомок
#2,
Count
=
5
в
потоке
Потомок
#3,
Count
=
5
в
потоке
Потомок
#1,
Count
=
6
в
потоке
Потомок
#2,
Count
=
6
в
потоке
Потомок
#3,
Count
=
6
в
потоке
Потомок
#1,
Count
=
7
в
потоке
Потомок
#2,
Count
=
7
в
потоке
Потомок
#3,
Count
=
7
в
потоке
Потомок
#1/
Count
=
8
в
потоке
Потомок
#2,
Count
=
8
в
потоке
Потомок
#3,
Count
=
8
в
потоке
Потомок
#1/
Count
=
9
Потомок #1 завершен.
В
потоке
Потомок
#2,
Count
=
9
Потомок #2 завершен.
В
потоке
Потомок
#3,
Count
=
9
Потомок #3 завершен.
Потомок #1 присоединен.
Потомок #2 присоединен.
Потомок #3 присоединен.
Основной поток завершен.
Как видите, выполнение потоков завершилось после возврата из последовательного ряда вызовов методаJoin ().
Передача аргумента потоку
Первоначально в среде .NET Framework нельзя было передавать аргумент потоку, когда он начинался, поскольку у метода, служившего в качестве точки входа в поток, не могло быть параметров. Если же потоку требовалось передать какую-то информацию, то к этой цели приходилось идти различными обходными путями, например использовать общую переменную. Но этот недостаток был впоследствии устранен, и теперь аргумент может быть передан потоку. Для этого придется воспользоваться другими формами методаStart (), конструктора классаThread,а также метода, служащего в качестве точки входа в поток.
Аргумент передается потоку в следующей форме методаStart ().
public void Start(object
Объект, указываемый в качестве аргумента
Для применения параметризированной формы методаStart() потребуется следующая форма конструктора классаThread:
public Thread(ParameterizedThreadStart