代码之家  ›  专栏  ›  技术社区  ›  Daniel Reyhanian

Thread.Sleep()是如何工作的?

  •  0
  • Daniel Reyhanian  · 技术社区  · 7 年前

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

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

    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()和线程具有相同的睡眠时间,因为它们是相同的函数,但为什么线程(首先执行)是最后一个完成的呢?

    锁定语句

    现在,如果我们添加一个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

    嘟嘟

    2/螺纹

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Милош Вељковић    7 年前

    看,这里实际上有两个线程,在主线程和第二个线程(foo())上。。 新线程(新线程开始(foo)).Start(); 执行将从主线程开始,这意味着该线程(主线程)将尝试调用foo(),即您的“1”,然后,主线程进入睡眠状态,第二个线程star foo(),即第二个线程“1”,第二个线程进入睡眠状态。。现在主线程将唤醒并完成作业“2”,“do”,最后一个“2”来自sec线程。那是没有锁的。