double arrow

Остановка и возобновление работы потоков


Приоритеты потоков

Каждый поток имеет определенный приоритет. Потоки с более высоким приоритетом имеют преимущество перед другими потоками и могут полностью блокировать работу потоков с более низкими приоритетами. Приоритет потока можно прочитать или изменить с помощью свойства Priority, которое является членом класса Thread.

Общий формат его использования таков:

public ThreadPriority Priority{ get; set ; }

Здесь ThreadPriority — перечисление, которое определяет следующие пять зна-

чений приоритета:

ThreadPriority.Highest высокий

ThreadPriority.AboveNormal выше нормального

ThreadPriority.Normal нормальный

ThreadPriority.BelowNormial ниже нормального

ThreadPriority.Lowest низкий

Каждый процесс (не поток!) имеет некоторый приоритет. Приоритет процесса, запустившего потоки считается базовым для потоков и принимается за нормальный. Например, установка разных приоритетов для потоков thr1 и thr2 будет выглядеть следующим образом:

thr1.Priority = ThreadPriority.AboveNormal;

thr2.Priority = ThreadPriority.BelowNormal;

Запущенный на выполнение поток может быть остановлен путем вызова метода Suspend(), а возобновление выполнения – путем вызова метода Resume():

thr1.Suspend(); // останов потока

thr1.Resume(); // восстановление работы потока

Для аварийного завершения работы потока служит метод Abort(). Этот метод имеет два формата:

public void Abort()

public void Abort(object info)

Метод Abort ()завершает работу потока и генерирует исключение типа ThreadAbortException для потока.

Исключение может быть перехвачено программным кодом. С помощью параметра info в программный блок catch, обрабатывающий данное исключение, может быть передана информация о причине завершения потока.

Пример демонстрирующий использование метода Abort ():

using System;

using System.Collections.Generic;

using System.Text;

using System.Threading;

namespace ThreadAbort

{

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

class Grd

{

int grade =0;// температура в градусах

// установка и чтение текущей температуры

public int Grade

{

get

{

return grade;

}

set

{

grade = value;

}

}

}

class MyThread

{

Grd gr; // Ссылка на объект "разогрева"

public Thread th; // Поток для "разогрева" объекта

public MyThread(Grd grd)

{

gr = grd;// Получаем ссылку на объект "разогрева"

th = new Thread(new ThreadStart(FnThr));

th.Start();

}

// Функция которая греет объект

void FnThr()

{ //здесь мы греем и можем "перегреться"

try //блок,где может быть вызвано исключение

{

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

{

Console.WriteLine("Температура={0}", gr.Grade);

lock(gr) gr.Grade += 10;

Thread.Sleep(100); // Передаем управление другому потоку

}

}

// Перехватываем исключение и печатаем причину

catch (ThreadAbortException abortException)

{

Console.WriteLine((string)abortException.ExceptionState);

}

}

}

class Program

{

static void Main(string[] args)

{

Grd gr = new Grd(); //Создаем объект для разогрева

MyThread thr = new MyThread(gr);//Запускаем процесс обогрева - поток

int grd;

lock(gr) grd = gr.Grade;

// Следим за процессом нагрева

while ( grd <= 70)

lock (gr) grd = gr.Grade;

thr.th.Abort("Перегрелись");// хватит греть

}

}

}

Результат работы программы:

Температура=0

Температура=10

Температура=20

Температура=30

Температура=40

Температура=50

Температура=60

Температура=70

Заказать ✍️ написание учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Сейчас читают про:
Поможем в написании
> Курсовые, контрольные, дипломные и другие работы со скидкой до 25%
3 569 лучших специалисов, готовы оказать помощь 24/7