Thread.Sleep() 如何工作?

所以我试图研究如何使用多线程,我注意到一些我不太明白的东西。


在下一段代码中,看起来 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 //线程


1 //foo


2 //foo


do //doo


2 //线程


假设 doo() 在没有 foo() 的情况下无法开始运行,我们假设最后一个“2”输出来自第一个线程。


这怎么可能?尽管 foo() 和 Thread 具有相同的休眠时间,因为它们是相同的函数,但为什么线程(首先执行)是最后一个完成的线程?


锁定语句

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


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 //线程


2 //线程


1 //foo


do //doo


2 //线程


现在看起来 doo() 在 foo() 结束之前就开始运行了!这是怎么回事?过程及其背后的逻辑是什么?


小唯快跑啊
浏览 133回答 1
1回答

开心每一天1111

看,你在这里实际上有两个线程,在主线程和第二个线程(foo())上。在 new Thread(new ThreadStart(foo)) 之后)。开始();执行将从主线程开始,这意味着这个线程(主线程)将尝试调用foo(),即你的“1”,之后,主线程进入睡眠状态,第二个线程star foo(),即第二个线程“1”,秒进入睡眠状态。现在主线程将唤醒并完成作业“2”,“do”,最后一个“2”来自sec线程。这是没有锁定的。使用锁定,主线程将执行 foo() 并且 sec 将被阻塞(“1”,3sec,“2”),当 foo() 解锁时,这意味着,sec 线程可以调用 foo(),当发生这种情况时,sec 打印“1”广告进入睡眠状态,现在(当 sec 正在睡眠时 CPU 寻找可以执行的线程),因此 CPU 执行主线程并打印“do”,然后 sec 将唤醒并打印“2”。
打开App,查看更多内容
随时随地看视频慕课网APP