Основные элементы класса 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