为了账号安全,请及时绑定邮箱和手机立即绑定

Thread.Sleep() 如何工作?

Thread.Sleep() 如何工作?

C#
小唯快跑啊 2022-08-20 17:21:00
所以我试图研究如何使用多线程,我注意到一些我不太明白的东西。在下一段代码中,看起来 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 //foo2 //foodo //doo2 //线程假设 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 //foodo //doo2 //线程现在看起来 doo() 在 foo() 结束之前就开始运行了!这是怎么回事?过程及其背后的逻辑是什么?
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

看,你在这里实际上有两个线程,在主线程和第二个线程(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”。


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号