Основные элементы класса Thread


Таблица 5.2


Элемент Вид Описание
CurrentThread Статическое свойство Возвращает ссылку на выполняющийся по- ток (только для чтения)
IsAlive Свойство Возвращает true или false в зависимо- сти от того запущен поток или нет
IsBackground Свойство Возвращает или устанавливает значение, которое показывает, является ли этот поток фоновым
Name Свойство Установка текстового имени потока
Priority Свойство Получить/установить приоритет потока (используется значение перечисления ThreadPriority
ThreadState Свойство Возвращает состояние потока (использует- ся значение перечисления ThreadState)
Abort Метод Генерирует исключение ThreadAbor- tException. Вызов этого метода обычно завершает работу потока
GetData, SetData Статические методы Возвращает (устанавливает) значение для указанного слота в текущем потоке
GetDomain, GetDo- mainID Статические методы Возвращает ссылку на домен приложения (идентификатор домена приложения), в рамках которого работает поток
GetHashCode метод Возвращает хеш-код для потока
Sleep Статический метод Приостанавливает выполнение текущего потока на заданное количество миллисе- кунд
Start Метод Начинает выполнение потока, определен- ного делегатом ThreadStart
Suspend Метод Приостанавливает выполнение потока. Ес- ли выполнение потока уже приостановле- но, то игнорируется
Resume Метод Возобновляет работу после приостановки потока
Join Метод Блокирует вызывающий поток до заверше- ния другого потока или указанного проме- жутка времени
Interrupt Метод Прерывает работу текущего потока

При создании объекта-потока ему передается делегат, определяющий ме- тод, выполнение которого выделяется в отдельный поток:

Thread t = new Thread (new ThreadStart (имя_метода)); После создания потока заданный метод начинает в нем свою работу, а первичный поток продолжает выполняться. В листинге 5.1 приведен пример

одновременной работы двух потоков.

Листинг 5.1.Создание вторичного потока

using System;

using System.Threading;

namespace ConsoleApplication1

{

class Program

{

static public void Hedgehog()

// метод для вторичного потока

{

for(inti= 0; i< 6; ++i)

{

Console.WriteLine(i);Thread.Sleep(1000);

}

}

static void Main()

{

Console.WriteLine("Первичный поток" +

Thread.CurrentThread.GetHashCode());

Thread ta = new Thread(newThreadStart(Hedgehog)); Console.WriteLine("Вторичный поток" +

ta.GetHashCode());

ta.Start();

for (int i = 0; i > -6; --i)

{

Console.Write(" " +i);Thread.Sleep(400);

}

}

}

}

Так как оба потока работают одновременно, то при использовании ими

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

Листинг 5.2.Потоки, использующие один объект

using System;

using System.Threading;

namespace ConsoleApplication1

{

class Class1

{

public void Do()

{

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

{

Console.Write(" " + i); Thread.Sleep(3);

}

}

}

class Program

{

static void Main()

{

Class1 a = new Class1(); Thread t1=new Thread (new

ThreadStart(a.Do));

t1.Name ="Second"; Console.WriteLine("Поток"+t1.Name); t1.Start();

Thread t2=new Thread (new

ThreadStart(a.Do)); t2.Name="Third"; Console.WriteLine("Поток"+t2.Name); t2.Start();

}

}

}

Для того чтобы блок кода мог использоваться в каждый момент времени

только одним потоком, применяется оператор lock, имеющий следующий формат:

lock (выражение) блок_операторов

Выражение определяет объект, который требуется заблокировать. Для

обычных методов в качестве выражения используется ключевое слово this, для статических – typeof(класс). Блок операторов задает критическую сек- цию кода, которую требуется заблокировать.

5.3. Программа работы

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


1. 1 и 2 6. 2и 13 11. 2 и 11
2. 1 и 3 7. 12 и 13 12. 10 и 11
3. 1 и 12 8. 1 и 14 13. 10 и 12
4. 2 и 12 9. 2 и 15 14. 1 и 12

5. 1 и 13 10. 1 и 11 15. 7 и 13

Метод решения дифференциальных уравнений взять из таблицы 5.3

Таблица 5.3

Наши рекомендации