Добавить в цитаты Настройки чтения

Страница 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(&quot;Поток &quot; + Thrd.Name + &quot; начат.&quot;);</b>

<b>    do {</b>

<b>      Count++;</b>

<b>      if(currentName != Thrd.Name) {</b>

<b>        currentName = Thrd.Name;</b>

<b>        Console.WriteLine(&quot;В потоке &quot; + currentName);</b>

<b>      }</b>

<b>    } while(stop == false &amp;&amp; Count &lt; 1000000000);</b>

<b>    stop = true;</b>

<b>    Console.WriteLine(&quot;Поток &quot; + Thrd.Name + &quot; завершен.&quot;);</b>

<b>  }</b>

<b>}</b>

<b>class PriorityDemo {</b>

<b>  static void Main() {</b>

<b>    MyThread mt1 = new MyThread(&quot;с высоким приоритетом&quot;);</b>

<b>    MyThread mt2 = new MyThread(&quot;с низким приоритетом&quot;);</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(&quot;Поток &quot; + mt1.Thrd.Name +</b>

<b>           &quot; досчитал до &quot; + mt1.Count);</b>

<b>    Console.WriteLine(&quot;Поток &quot; + mt2.Thrd.Name +</b>

<b>           &quot; досчитал до &quot; + mt2.Count);</b>

<b>  }</b>

<b>}</b>

Вот к какому результату может привести выполнение этой программы.

<b>Поток с высоким приоритетом начат.</b>

<b>В потоке с высоким приоритетом</b>