Метод Join() ожидает до тех пор, пока поток, для которого он был вызван, не завершится. Его имя отражает принцип ожидания до тех пор, пока вызывающий поток не присоединится к вызванному методу. Если же данный поток не был начат, то генерируется исключение ThreadStateException. В других формах метода Join() можно указать максимальный период времени, в течение которого следует ожидать завершения указанного потока.

В приведенном ниже примере программы метод Join() используется для того, чтобы основной поток завершился последним.

// Использовать метод Join().

using System;

using System.Threading;

class MyThread {

  public int Count;

  public Thread Thrd;

  public MyThread(string name) {

    Count = 0;

    Thrd = new Thread(this.Run);

    Thrd.Name = name;

    Thrd.Start();

  }

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

  void Run() {

    Console.WriteLine(Thrd.Name + " начат.");

    do {

      Thread.Sleep(500);

      Console.WriteLine ("В потоке " + Thrd.Name +

              ", Count = " + Count);

      Count++;

    } while(Count < 10);

    Console.WriteLine(Thrd.Name + " завершен.");

  }

}

// Использовать метод Join() для ожидания до тех пор,

// пока потоки не завершатся,

class JoinThreads {

  static void Main() {

  Console.WriteLine("Основной поток начат.");

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

    MyThread mt1 = new MyThread("Потомок #1");

    MyThread mt2 = new MyThread("Потомок #2");

    MyThread mt3 = new MyThread("Потомок #3");

    mt1.Thrd.Join();

    Console.WriteLine("Потомок #1 присоединен.");

    mt2.Thrd.Join();

    Console.WriteLine("Потомок #2 присоединен.");

    mt3.Thrd.Join();

    Console.WriteLine("Потомок #3 присоединен.");

    Console.WriteLine("Основной поток завершен.");

  }

}

Ниже приведен один из возможных результатов выполнения этой программы. Напомним, что он может отличаться в зависимости от среды выполнения, операционной системы и прочих факторов, влияющих на выполнение программы.

Основной поток начат.

Потомок #1 начат.

Потомок #2 начат.

Потомок #3 начат.

В потоке Потомок #1, Count = 0

В потоке Потомок #3, Count = 0

В потоке Потомок #2, Count = 0

В потоке Потомок #3, Count = 1

В потоке Потомок #2, Count = 1

В потоке Потомок #1, Count = 1

В потоке Потомок #1, Count = 2

В потоке Потомок #3, Count = 2

В потоке Потомок #2, Count = 2

В потоке Потомок #2, Count = 3

В потоке Потомок #3, Count = 3

В потоке Потомок #1, Count = 3

В потоке Потомок #3, Count = 4

В потоке Потомок #1, Count = 4

В потоке Потомок #2, Count = 4

В потоке Потомок #3, Count = 5

В потоке Потомок #1, Count = 5

В потоке Потомок #2, Count = 5

В потоке Потомок #2, Count = 6

В потоке Потомок #1, Count = 6

В потоке Потомок #3, Count = 6

В потоке Потомок #2, Count = 7

В потоке Потомок #1, Count = 7

В потоке Потомок #3, Count = 7

В потоке Потомок #2, Count = 8

В потоке Потомок #1, Count = 8

В потоке Потомок #3, Count = 8

В потоке Потомок #2, Count = 9

Потомок #2 завершен.

В потоке Потомок #1, Count = 9

В потоке Потомок #3, Count = 9

Потомок #3 завершен.

Потомок #1 завершен.

Потомок #1 присоединен.

Потомок #2 присоединен.

Потомок #3 присоединен.

Перейти на страницу:

Похожие книги