Принципы объектно-ориентированного программирования

         

Управление временем существования потоков



Управление временем существования потоков

Чтобы управлять активностью или временем жизни потока, надо решить массу задач. С Ътим позволяют справиться методы Thread. Например, довольно часто поток нужно приостановить. Это можно сделать, вызвав метод Thread. Sleep, который принимает единственный аргумент, представляющий собой время (в миллисекундах), на которое требуется приостановить поток. Заметьте: метод Thread.Sleep является статическим и не может быть вызван с экземпляром объекта Thread. На то есть веская причина. Не допускается вызывать Thread.Sleep для любого другого потока, кроме исполняемого в текущий момент. Статический метод Thread.Sleep вызывает статический же метод


CurrentThread, который затем приостанавливает этот поток на указанное время. Пример:

using System;

using System.Threading;

class ThreadSleepApp

{

public static void WorkerThreadMethodQ

{

Console.WriteLine("Worker thread started");

int sleepTime = 5000;

Console.WriteLine("\tsleeping for {0} seconds",

sleepTime / 1000);

Thread.Sleep(sleepTime); // Приостановка на пять секунд. Console.WriteLine("\twaking up"); >

public static void Main()

{

ThreadStart worker = new ThreadStart(WorkerThreadMethod);

Console.WriteLine("Main - Creating worker thread");

Thread t = new Thread(worker); t.Start();

Console.WriteLine

("Main - Have requested the start of worker thread"); } }

Есть еще два способа вызова метода Thread.Sleep. Первый — вызов Thread. Sleep со значением 0. При этом вы заставите текущий поток освободить неиспользованный остаток своего кванта. При передаче значения Timeout. Infinite поток будет приостановлен на неопределенно долгий срок, пока это состояние потока не будет прервано другим потоком, вызвавшим метод приостановленного потока Thread.Interrupt.

Второй способ приостановить исполнение потока — вызов метода Thread.Suspend. Между этими методиками несколько важных отличий. Во-первых, можно вызвать метод Thread. Suspend для потока, исполняемого в текущий момент, или для другого потока. Во-вторых, если таким образом приостановить выполнение потока, любой другой поток способен возобновить его выполнение с помощью метода Thread. Resume. Обратите внимание, что, когда один поток приостанавливает выполнение другого, первый поток не блокируется. Возврат управления после вызова происходит немедленно. Кроме того, единственный вызов Thread.Resume возобновит исполнение данного потока независимо от числа вызовов метода Thread.Suspend, выполненных ранее.



Содержание раздела