1. 优先级概述
每个线程都有一个"优先级",优先级可以用整数表示,取值范围为0~10,0为最低优先级,10位最高优先级,当决定哪个线程需要调度时,首先查看是否存在优先级高的可调度线程,如果存在,就从中选择进行调度。
Thread类有三个优先级静态常量:MAX_PRIORITY为10,为线程最高优先级;MIN_PRIORITY取值为1,为线程最低优先级;NORM_PRIORITY取值为5,为线程中间位置的优先级。默认情况下,线程的优先级为NORM_PRIORITY。特殊情况在于现在计算机都是多核多线程的配置,有可能优先级低的线程比优先级高的线程先运行,优先级高的线程可能比优先级低的线程后运行。
2. 示例
using System;
using System.Threading;
using static System.Console;
using static System.Threading.Thread;
using static System.Diagnostics.Process;
namespace Chapter1.Recipe6
{
class Program
{
static void Main(string[] args)
{
WriteLine($"输出当前线程的调度优先级: {CurrentThread.Priority}");
WriteLine("在所有可用的处理器内核上运行!");
//调用方法,此时可能存在多个空闲的处理器用于计算,因此,线程的优先级低的可能比优先级高的先执行
RunThreads();
Sleep(TimeSpan.FromSeconds(2));
WriteLine("Running on a single core");
//获取或设置一些处理器,此进程中的线程可以按计划在这些处理器上运行
GetCurrentProcess().ProcessorAffinity = new IntPtr(1);
RunThreads();
Console.ReadKey();
}
static void RunThreads()
{
var sample = new ThreadSample();
//新建一个线程并初始化以及设置线程的名称
var threadOne = new Thread(sample.CountNumbers);
threadOne.Name = "ThreadOne";
var threadTwo = new Thread(sample.CountNumbers);
threadTwo.Name = "ThreadTwo";
//设置线程的优先级
threadOne.Priority = ThreadPriority.Highest;
threadTwo.Priority = ThreadPriority.Lowest;
//启动线程
threadOne.Start();
threadTwo.Start();
//将当前线程阻塞指定的时间,当前线程只有有限的执行时间
Sleep(TimeSpan.FromSeconds(2));
sample.Stop();
}
class ThreadSample
{
private bool _isStopped = false;
public void Stop()
{
_isStopped = true;
}
public void CountNumbers()
{
long counter = 0;
while (!_isStopped)
{
counter++;
}
WriteLine($"{CurrentThread.Name} with " +
$"{CurrentThread.Priority,11} priority " +
$"has a count = {counter,13:N0}");
}
}
}
}