【C#.37】多线程中的Sleep以及子线程优先级

继续上篇,其实在写文章的过程中真的实践了不少,而且发现和自己原来认为的有挺多不同的。因此有错误的话请多指正。以下的内容都是经过试验得出的:


using System;
using System.Threading;

namespace Chapter1.Recipe2
{
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(PrintNumbersWithDelay);
t.Start();
Thread.Sleep(2000);
PrintNumbers();
}

static void PrintNumbers()
{
Console.WriteLine("Starting PrintNumbers()...线程优先级{0}",Thread.CurrentThread.Priority);
for (int i = 1; i < 10000; i++)
{
Console.WriteLine(i);
}
}

static void PrintNumbersWithDelay()
{
Console.WriteLine("Starting PrintNumbersWithDelay()...线程优先级{0}", Thread.CurrentThread.Priority);
Console.WriteLine("子线程是否是后台线程:{0}",Thread.CurrentThread.IsBackground);
for (int i = 1; i < 10; i++)
{
Thread.Sleep(2000);
Console.WriteLine(i);
}
}
}
}
【C#.37】多线程中的Sleep以及子线程优先级_第1张图片

【C#.37】多线程中的Sleep以及子线程优先级_第2张图片
【C#.37】多线程中的Sleep以及子线程优先级_第3张图片


【C#.37】多线程中的Sleep以及子线程优先级_第4张图片


我们来仔细看一下上述结果。首先PrintNumbersWithDelay()中有sleep两秒的语句。Sleep的含义是让当前执行的线程处于休眠状态,占用尽可能少的系统资源(cpu时间)。第二点需要指出的是,main和t线程的优先级相同,且t线程是前台线程,这意味着必须等待t线程执行完毕才算应用结束。第三点,也是很重要的一点:由于两个线程的优先级相同,因此他们其实是公平地均等使用CPU资源。也就是说,main和t线程可以互相在对方执行完时间片后自己执行一时间片。具体来看,在main运行后先启动t线程,在t线程中,由于PrintNumbersWithDelay()需要等待两秒钟,所以main线程得到了cpu资源,继续往下执行PrintNumbers(),在两秒钟等待时间结束后,t线程又再次得到cpu资源(因为与main有相同的优先级),因此打印了数字1,随后再次休眠2秒,cpu交还main,2秒后再打印数字2。。。

因此,综上所述,相同优先级的线程他们是共用cpu资源的,当一方不使用时,另一方可以使用,而当一方从休眠中恢复后,cpu资源再次可以被分配给它。总之,两方都是公平的。



你可能感兴趣的:(c#,多线程)