C#多线程使用Thread.Sleep与Join时控制台最先输出哪些Player
问题解答
执行流程梳理
我们顺着主线程的执行顺序一步步拆解逻辑:
- 主线程首先依次调用
threadE.Start()、threadC.Start()、threadA.Start(),三个线程启动后立刻进入Run方法,执行Thread.Sleep(100),相当于三个线程几乎同时开始休眠100毫秒 - 紧接着主线程执行
threadC.Join(),此时主线程会直接阻塞,必须等待C线程完全执行完毕,才能继续往下执行后续代码 - 100毫秒休眠结束后,已经启动的E、C、A三个线程都会被操作系统唤醒,各自执行
Console.Write(tag + ",")输出自己的标签- 这三个线程的输出顺序由操作系统的线程调度策略决定,没有固定先后,任意排列都属于正常情况
- 此时B、D线程还没有被调用
Start(),完全没有启动,不可能先于E/C/A输出
- 只有等C线程执行完成、
threadC.Join()返回后,主线程才会继续往下依次启动B、D线程,因此B、D的输出时间一定晚于E/C/A三个线程。
结论
最先输出的一定是A、C、E三个标签,三者输出顺序不固定,但B、D绝对不会出现在最先的输出序列中。
内容的提问来源于stack exchange,提问作者androidvango
相关产品推荐
相关产品推荐

