这里解释一下线程的执行顺序

本文关键字:线程 执行 顺序 一下 解释 这里 | 更新日期: 2023-09-27 17:50:19

从下面的代码中,我以为"y"会在x之前打印出来,但是"x"先开始打印。我以线性方式阅读这篇文章,那么为什么"x"首先开始打印,即使在主方法中首先调用t.s start () ?

static void Main()
{
    Thread t = new Thread(ThreadTest.WriteY);
    t.Start();
    for(int i = 0; i < 1000; i++) Console.Write("x");
}
public class ThreadTest
{
    public static void WriteY()
    {
    for(int i = 0; i < 1000; i++) Console.WriteLine("y");
    }
}

这里解释一下线程的执行顺序

好吧,可以这样考虑。

给你的朋友一叠纸,你自己也留一叠。

然后你告诉你的朋友"开始在那些纸上写数字",然后你马上也开始做同样的事情。

现在告诉我,你们谁会第一个完成?

考虑到这是你的问题,为什么?

在这里不可能确定地键入正确的答案,因为有太多的事情影响你们两个的速度:

  • 开始写数字
  • 输出数字
  • 移到下一张纸

所以基本上,你的朋友可能会在你开始之前开始,反之亦然,但你无法事先知道,这不是"正确答案"。

每次运行这个程序时,它都有可能表现不同,至少在两个线程之间的执行顺序方面是不同的。

话虽如此,启动一个新线程是有开销的,这可能会使天平偏向主线程在额外的线程进入循环之前。然而,如果不可能发生相反的情况,我会感到惊讶。

当您生成一个新线程时,操作系统将接管并安排工作在稍后的时间进行。关键是你没有办法知道它什么时候会发生,这就是为什么你可以多次运行相同的应用程序,每次看到不同的结果。

启动一个新线程可能需要相当长的时间,所以在WriteY开始运行之前需要一段时间。与此同时,主线程将继续运行,因此您将看到在大多数情况下(如果不是所有情况)打印大量x

此外,调度本身由操作系统处理。

简而言之:您不应该试图根据阅读源代码来猜测执行顺序。

仅仅因为你在某个时间启动了一个线程并不意味着该线程中的代码将在调用方法的下一行代码执行之前启动。

我猜你可以运行这个程序几千次,最后得到一些以'y'开头的,另一些以'x'开头的。

线程执行顺序不可预知

在这种情况下,可能是构建线程(stackframe/etc)的代码减慢了速度

因为它不确定什么先开始。线程的执行顺序并不确定。如果你启动你的程序n次,可以假设你看到x和y都先被打印出来。

如果你想确保线程执行的顺序,你应该查看Thread。加入