Страница 402 из 502
<b>public ThreadPriority Priority{ get; set; }</b>
где ThreadPriority обозначает перечисление, в котором определяются приведенные ниже значения приоритетов.
<b>ThreadPriority.Highest</b>
<b>ThreadPriority.AboveNormal</b>
<b>ThreadPriority.Normal</b>
<b>ThreadPriority.BelowNormal</b>
<b>ThreadPriority.Lowest</b>
По умолчанию для потока устанавливается значение приоритета ThreadPriority.Normal.
Для того чтобы стало понятнее влияние приоритетов на исполнение потоков, обратимся к примеру, в котором выполняются два потока: один с более высоким приоритетом. Оба потока создаются в качестве экземпляров объектов класса MyThread. В методе Run() организуется цикл, в котором подсчитывается определенное число повторений. Цикл завершается, когда подсчет достигает величины 1000000000 или когда статическая переменная stop получает логическое значение true. Первоначально переменная stop получает логическое значение false. В первом потоке, где производится подсчет до 1000000000, устанавливается логическое значение true переменной stop. В силу этого второй поток оканчивается на следующем своем интервале времени. На каждом шаге цикла строка в переменной currentName проверяется на наличие имени исполняемого потока. Если имена потоков не совпадают, это означает, что произошло переключение исполняемых задач. Всякий раз, когда происходит переключение задач, имя нового потока отображается и присваивается переменной currentName. Это дает возможность отследить частоту доступа потока к ЦП. По окончании обоих потоков отображается число повторений цикла в каждом из них.
<b>// Продемонстрировать влияние приоритетов потоков.</b>
<b>using System;</b>
<b>using System.Threading;</b>
<b>class MyThread {</b>
<b> public int Count;</b>
<b> public Thread Thrd;</b>
<b> static bool stop = false;</b>
<b> static string currentName;</b>
<b> /* Сконструировать новый поток. Обратите внимание на то, что данный конструктор еще не начинает выполнение потоков. */</b>
<b> public MyThread(string name) {</b>
<b> Count = 0;</b>
<b> Thrd = new Thread(this.Run);</b>
<b> Thrd.Name = name; currentName = name;</b>
<b> }</b>
<b> // Начать выполнение нового потока,</b>
<b> void Run() {</b>
<b> Console.WriteLine("Поток " + Thrd.Name + " начат.");</b>
<b> do {</b>
<b> Count++;</b>
<b> if(currentName != Thrd.Name) {</b>
<b> currentName = Thrd.Name;</b>
<b> Console.WriteLine("В потоке " + currentName);</b>
<b> }</b>
<b> } while(stop == false && Count < 1000000000);</b>
<b> stop = true;</b>
<b> Console.WriteLine("Поток " + Thrd.Name + " завершен.");</b>
<b> }</b>
<b>}</b>
<b>class PriorityDemo {</b>
<b> static void Main() {</b>
<b> MyThread mt1 = new MyThread("с высоким приоритетом");</b>
<b> MyThread mt2 = new MyThread("с низким приоритетом");</b>
<b> // Установить приоритеты для потоков.</b>
<b> mt1.Thrd.Priority = ThreadPriority.AboveNormal;</b>
<b> mt2.Thrd.Priority = ThreadPriority.BelowNormal;</b>
<b> // Начать потоки,</b>
<b> mt1.Thrd.Start();</b>
<b> mt2.Thrd.Start() ;</b>
<b> mt1.Thrd.Join();</b>
<b> mt2.Thrd.Join();</b>
<b> Console.WriteLine();</b>
<b> Console.WriteLine("Поток " + mt1.Thrd.Name +</b>
<b> " досчитал до " + mt1.Count);</b>
<b> Console.WriteLine("Поток " + mt2.Thrd.Name +</b>
<b> " досчитал до " + mt2.Count);</b>
<b> }</b>
<b>}</b>
Вот к какому результату может привести выполнение этой программы.
<b>Поток с высоким приоритетом начат.</b>
<b>В потоке с высоким приоритетом</b>