线程优先级

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}");
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值