Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
My_shpory_Ivan_Ivanich (2).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
149.35 Кб
Скачать

12. Класс Thread, логические и физические потоки выполнения, жизненный цикл потока выполнения

Для создания потоков и управления ими в .NET предназначен класс Thread, определенный в пространстве имен System.Threading.

Концептуально потоки NET делятся на физические и логические. Физические потоки NET опираются на потоки, реализованные базовой платформой. Логические потоки эмулируются средой .NET без опоры на базовую платформу. Концепций логических потоков была введена в NET на случай распространения на платформах, не поддерживающих многолоточность. В Win32 используются только физические потоки.

Таким образом, можно сказать, что главный поток приложения .NET по умолчанию не синхронизирован с другими потоками. Основные потоки могут продолжать выполняться и после завершения главного потока, а фоновые будут принудительно остановлены в момент его завершения.

Создание нового объекта Thread приводит к созданию нового управляемого потока. Класс Thread имеет конструкторы, которые принимают делегат ThreadStart или делегат ParameterizedThreadStart; этот делегат служит оболочкой для метода, который был вызван новым потоком при вызове пользователем метода Start. Неоднократный вызов перегрузки Start приводит к созданию исключения ThreadStateException.

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

Thread InstanceCaller = new Thread(new ThreadStart(myObject.Method));

InstanceCaller.Start();

В .NET Framework версии 2.0 делегат ParameterizedThreadStart предоставляет простой способ передачи объекта, содержащего данные, в поток при вызове перегрузки метода Thread.Start. Пример кода см. в разделеParameterizedThreadStart.

Использование делегата ParameterizedThreadStart не является типобезопасным способом передачи данных, так как перегрузка метода Thread.Start принимает любой объект. Альтернативой является инкапсуляция процедуры потока и данных во вспомогательном классе и использование делегата ThreadStart для выполнения процедуры потока.

Всего различают две разновидности многозадачности: на основе процессов и на основе потоков. Отличия многозадачности на основе процессов и потоков сводится к следующему: многозадачность на основе процессов организуется для параллельного выполнения программ, а многозадачность на основе потоков - для параллельного выполнения отдельных частей одной программы. В .NET Framework поддерживаются обе разновидности многозадачности: на основе процессов и на основе потоков. Поэтому можно создавать как процессы, так и потоки, а также управлять и теми и другими.

Класс Thread

Класс Thread является самым элементарным из всех типов пространства имен System.Threading. Основные свойства и методы класса Thread приведены в таблице ниже.

Таблица 4.1. Основные свойства и методы класса Thread

Имя

Описание

CurrentContext

Это свойство только для чтения возвращает контекст, в котором в данный момент выполняется поток

CurrentThread

Это свойство только для чтения возвращает ссылку на текущий выполняемый поток

GetDomain(), GetDomainID()

Этот метод возвращает ссылку на текущий AppDomain или идентификатор этого домена, в котором выполняется текущий поток

Sleep()

Этот метод приостанавливает текущий поток на заданное время

IsAlive

Возвращает булевское значение, указывающее на то, запущен ли поток (и еще не прерван и не отменен)

IsBackground

Получает или устанавливает значение, указывающее, является ли данный поток "фоновым" (подробнее объясняется далее)

Name

Позволяет вам установить дружественное текстовое имя потока

Priority

Получает или устанавливает приоритет потока, который может принимать значение из перечисления ThreadPriority

ThreadState

Получает состояние данного потока, которому может быть присвоено значение из перечисления ThreadState

Abort()

Инструктирует CLR прервать поток, как только это будет возможно

Interrupt()

Прерывает (т.е. приостанавливает) текущий поток на заданный период ожидания

Join()

Блокирует вызывающий поток до тех пор, пока указанный поток (тот, для которого вызван Join()) не завершится

Resume()

Возобновляет ранее приостановленный поток

Start()

Инструктирует CLR запустить поток как можно скорее

Suspend()

Приостанавливает поток. Если поток уже приостановлен, вызов Suspend() не дает эффекта

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]