于是,我就研究如何利用多线程,而且我注意到一些东西,我不完全得到。
在接下来的一段代码,好像斗()开始运行的线程完成之前,虽然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()和线程具有相同的睡眠时间,因为它们是相同的功能,怎么来的线程(先执行)是最后一个完成?
现在,如果我们增加一个锁声明,如下所示:
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()之前结束!这是怎么回事吗?什么是过程和它背后的逻辑是什么?
你看,你在这里实际上是两个线程,在主,第二个线程(富())。经过新主题(新的ThreadStart(富))启动()。执行将与主线程启动,意味着这个线程(主线程)将尝试调用foo(),也就是你的“1”,在此之后,主线程进入睡眠状态及第二线程星富(),也就是二线一个“1”,秒进入睡眠状态。现在主线程将被唤醒,并会完成这项工作“2”,“做”,最后“2”是秒线程。这是一个没有锁定。
与锁定,主线程将做FOO()和秒将被阻塞(“1”,3秒,“2”)中,当foo()从解锁平均,仲线程可以调用foo(),并且当发生这种情况秒打印“1”的广告去睡觉,现在(当秒是睡CPU寻找能够执行的线程),所以CPU的exe一个主线程和打印“做”,然后秒将唤醒并打印“2”。 。
正如评论所说,控制台写入缓存。
我简单地添加一个数组,然后打印其在端部的值。
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
现在,它更有道理。谢谢!关于线程,睡和锁的任何其它信息被理解。