Thread.Sleep() 如何运作?

How Thread.Sleep() works?

所以我尝试研究如何使用多线程,但我注意到了一些我不太了解的东西。

在下一段代码中,似乎 doo() 在 Thread 完成之前开始 运行,尽管 foo 与 Thread 相同:

static void Main(string[] args)
{
    new Thread(new ThreadStart(foo)).Start();
    foo();
    doo();
}

public static void foo()
{

    Console.WriteLine("1");
    Thread.Sleep(3000);
    Console.WriteLine("2");
}

public static void doo()
{
    Console.WriteLine("do");
}

输出为:

1 //Thread

1 //foo

2 //foo

do //doo

2 //Thread

假设 doo() 无法启动 运行 没有 foo() 完成,我们假设最后一个“2”输出来自第一个线程。

怎么可能?虽然 foo() 和 Thread 因为是同一个函数,休眠时间是一样的,但为什么先执行的 Thread 是最后一个完成的呢?

锁定语句

现在,如果我们添加一个锁定语句,如下所示:

static object syncLock = new object();

static void Main(string[] args)
{
    new Thread(new ThreadStart(foo)).Start();
    foo();
    doo();
}

public static void foo()
{
    lock (syncLock)
    {
        Console.WriteLine("1");
        Thread.Sleep(3000);
        Console.WriteLine("2");
    }        
}

public static void doo()
{
    Console.WriteLine("do");
}

输出为:

1 //Thread

2 //Thread

1 //foo

do //doo

2 //Thread

现在似乎 doo() 在 foo() 结束之前 运行 开始了!这里发生了什么?其背后的过程和逻辑是什么?

看,这里实际上有两个线程,在主线程和第二个线程 (foo()) .. new Thread(new ThreadStart(foo)).Start();执行后会从主线程开始,也就是说这个线程(主线程)会尝试调用foo(),也就是你的“1”,之后,主线程进入睡眠状态,第二个线程 star foo(),即第二个“1”,第二个线程进入睡眠状态..现在主线程将醒来并完成工作“2 ","do",最后一个“2”来自sec线程。那就是没有锁定。

有了锁,主线程会做foo()而副线程会被阻塞("1",3sec,"2"),当foo()被解锁时,副线程可以调用foo(),当这种情况发生时,sec 打印“1”广告进入休眠状态,现在(sec 正在休眠 CPU 寻找可以执行的线程),所以 CPU 执行一个主线程并打印一个 "do" 然后 sec 将醒来并打印“2”..