Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Метод Join()

Несколько потоков выполняются “параллельно” в соответствии с предпочтениями планировщика потоков. Нестатический метод Join() позволяет изменить последовательность выполнения потоков многопоточного приложения. Метод Join() выполняется в одном из потоков по отношению к другому потоку.

В результате выполнения этого метода данный текущий поток немедленно блокируется до тех пор, пока не завершит своё выполнение поток, по отношению к которому был вызван метод Join.

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

using System;

using System.Threading;

public class ThreadWork

{

public static void DoWork()

{

for(int i=0; i<10; i++)

{

Console.WriteLine(“Thread - working.”);

Thread.Sleep(10);

}

Console.WriteLine(“Thread - finished working.”);

}

}

class ThreadTest

{

public static void Main()

{

ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork);

Thread myThread = new Thread(myThreadDelegate);

myThread.Start();

Thread.Sleep(100);

myThread.Join(); // Закомментировать вызов метода и почувствовать разницу.

Console.WriteLine(“Main ending.”);

}

}

Состояния потока (перечисление ThreadState)

Класс ThreadState определяет набор всех возможных состояний выполнения для потока. После создания потока и до завершения он находится по крайней мере в одном из состояний. Потоки, созданные в общеязыковой среде выполнения, изначально находятся в состоянии Unstarted, в то время как внешние потоки, приходящие в среду выполнения, находятся уже в состоянии Running. Потоки с состоянием Unstarted переходят в состояние Running при вызове метода Start. Не все комбинации значений ThreadState являются допустимыми; например, поток не может быть одновременно в состояниях Aborted и Unstarted.

В следующей таблице перечислены действия, вызывающие смену состояния.

Действие

Состояние Потока

Поток создается в среде CLR.

Unstarted

Поток вызывает метод Start.

Running

Поток начинает выполнение.

Running

Поток вызывает метод Sleep.

WaitSleepJoin

Поток вызывает метод Wait для другого объекта.

WaitSleepJoin

Поток вызывает метод Join для другого потока.

WaitSleepJoin

Другой поток вызывает метод Interrupt.

Running

Другой поток вызывает метод Suspend.

SuspendRequested

Поток отвечает на запрос метода Suspend.

Suspended

Другой поток вызывает метод Resume.

Running

Другой поток вызывает метод Abort.

AbortRequested

Поток отвечает на запрос метода Abort.

Stopped

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

Stopped

Начальное состояние потока (если это не главный поток), в котором он оказывается непосредственно после его создания – Unstarted. В этом состоянии он пребывает до тех пор, пока вызовом метода Start() он не будет переведён в состояние Running.

В дополнение к вышеперечисленным состояниям, существует также Background состояние, которое указывает, выполняется ли поток на фоне или на переднем плане.

Свойство Thread.ThreadState потока содержит текущее состояние потока. Для определения текущего состояния потока в приложении можно использовать битовые маски. Пример условного выражения:

if((myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0) {…}

Члены перечисления:

Имя члена

Описание

Значение

Aborted

Поток находится в Stopped состоянии.

256

AbortRequested

Метод Thread.Abort был вызван для потока, но поток еще не получил задерживающийся объект System.Threading.ThreadAbortException, который будет пытаться завершить поток.

128

Background

Поток выполняется как фоновый поток, что является противоположным к приоритетному потоку. Это состояние контролируется заданием свойства Thread.IsBackground.

4

Running

Поток был запущен, он не заблокирован, и нет задерживающегося объекта ThreadAbortException.

0

Stopped

Процесс остановлен.

16

StopRequested

Поток запрашивается на остановку. Это только для внутреннего использования.

1

Suspended

Работа потока была приостановлена.

64

SuspendRequested

Запрашивается приостановка работы потока.

2

Unstarted

Метод Thread.Start не был вызван для потока.

8

WaitSleepJoin

Поток заблокирован в результате вызова к методам Wait, Sleep или Join.

32

Ниже приводится диаграмма состояний потока.