Thread.Sleep() 如何运作?
How Thread.Sleep() works?
所以我尝试研究如何使用多线程,但我注意到了一些我不太了解的东西。
在下一段代码中,似乎 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 //Thread
1 //foo
2 //foo
do //doo
2 //Thread
假设 doo() 无法启动 运行 没有 foo() 完成,我们假设最后一个“2”输出来自第一个线程。
怎么可能?虽然 foo() 和 Thread 因为是同一个函数,休眠时间是一样的,但为什么先执行的 Thread 是最后一个完成的呢?
锁定语句
现在,如果我们添加一个锁定语句,如下所示:
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 //Thread
2 //Thread
1 //foo
do //doo
2 //Thread
现在似乎 doo() 在 foo() 结束之前 运行 开始了!这里发生了什么?其背后的过程和逻辑是什么?
看,这里实际上有两个线程,在主线程和第二个线程 (foo()) ..
new Thread(new ThreadStart(foo)).Start();执行后会从主线程开始,也就是说这个线程(主线程)会尝试调用foo(),也就是你的“1”,之后,主线程进入睡眠状态,第二个线程 star foo(),即第二个“1”,第二个线程进入睡眠状态..现在主线程将醒来并完成工作“2 ","do",最后一个“2”来自sec线程。那就是没有锁定。
有了锁,主线程会做foo()而副线程会被阻塞("1",3sec,"2"),当foo()被解锁时,副线程可以调用foo(),当这种情况发生时,sec 打印“1”广告进入休眠状态,现在(sec 正在休眠 CPU 寻找可以执行的线程),所以 CPU 执行一个主线程并打印一个 "do" 然后 sec 将醒来并打印“2”..
所以我尝试研究如何使用多线程,但我注意到了一些我不太了解的东西。
在下一段代码中,似乎 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 //Thread
1 //foo
2 //foo
do //doo
2 //Thread
假设 doo() 无法启动 运行 没有 foo() 完成,我们假设最后一个“2”输出来自第一个线程。
怎么可能?虽然 foo() 和 Thread 因为是同一个函数,休眠时间是一样的,但为什么先执行的 Thread 是最后一个完成的呢?
锁定语句
现在,如果我们添加一个锁定语句,如下所示:
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 //Thread
2 //Thread
1 //foo
do //doo
2 //Thread
现在似乎 doo() 在 foo() 结束之前 运行 开始了!这里发生了什么?其背后的过程和逻辑是什么?
看,这里实际上有两个线程,在主线程和第二个线程 (foo()) .. new Thread(new ThreadStart(foo)).Start();执行后会从主线程开始,也就是说这个线程(主线程)会尝试调用foo(),也就是你的“1”,之后,主线程进入睡眠状态,第二个线程 star foo(),即第二个“1”,第二个线程进入睡眠状态..现在主线程将醒来并完成工作“2 ","do",最后一个“2”来自sec线程。那就是没有锁定。
有了锁,主线程会做foo()而副线程会被阻塞("1",3sec,"2"),当foo()被解锁时,副线程可以调用foo(),当这种情况发生时,sec 打印“1”广告进入休眠状态,现在(sec 正在休眠 CPU 寻找可以执行的线程),所以 CPU 执行一个主线程并打印一个 "do" 然后 sec 将醒来并打印“2”..