Thread.sleep()方法是如何工作的?

问题描述 投票:0回答:2

于是,我就研究如何利用多线程,而且我注意到一些东西,我不完全得到。

在接下来的一段代码,好像斗()开始运行的线程完成之前,虽然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

做//斗

2 //主题

假设斗()无法启动时不富()运行完成后,我们假设最后一个“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 //主题

现在,它似乎像斗()开始运行FOO()之前结束!这是怎么回事吗?什么是过程和它背后的逻辑是什么?

c# multithreading thread-sleep
2个回答
2
投票

你看,你在这里实际上是两个线程,在主,第二个线程(富())。经过新主题(新的ThreadStart(富))启动()。执行将与主线程启动,意味着这个线程(主线程)将尝试调用foo(),也就是你的“1”,在此之后,主线程进入睡眠状态及第二线程星富(),也就是二线一个“1”,秒进入睡眠状态。现在主线程将被唤醒,并会完成这项工作“2”,“做”,最后“2”是秒线程。这是一个没有锁定。

与锁定,主线程将做FOO()和秒将被阻塞(“1”,3秒,“2”)中,当foo()从解锁平均,仲线程可以调用foo(),并且当发生这种情况秒打印“1”的广告去睡觉,现在(当秒是睡CPU寻找能够执行的线程),所以CPU的exe一个主线程和打印“做”,然后秒将唤醒并打印“2”。 。


0
投票

正如评论所说,控制台写入缓存。

我简单地添加一个数组,然后打印其在端部的值。

class Program
    {
        static object syncLock = new object();
        static int[] arr = new int[5];
        static int counter = 0;
        static void Main(string[] args)
        {
            new Thread(new ThreadStart(foo)).Start();
            foo();
            doo();
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(arr[i]);
            }
        }

        public static void foo()
        {
            arr[counter] = 1;
                counter++;
                Thread.Sleep(3000);
            arr[counter] = 2;
            counter++;
        }

        public static void doo()
        {
            arr[counter] = 3;
            counter++;
        }

    }

输出是:

1

1

2

2

3

现在,它更有道理。谢谢!关于线程,睡和锁的任何其它信息被理解。

© www.soinside.com 2019 - 2024. All rights reserved.