刚接触多线程 多线程应该是并发的,可是为什么我执行下面的代码时,有时候感觉又像是单线程的一样呢?
static void Main(string[] args)
{
ParameterizedThreadStart p = new ParameterizedThreadStart(wirtmsg1);
ParameterizedThreadStart p1 = new ParameterizedThreadStart(wirtmsg2);
Thread t1 = new Thread(p1);
Thread t = new Thread(p);
t.Start(2);
t1.Start(3);
wirtmsg(1);
Console.ReadLine();
} static void wirtmsg(object o)
{
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", o);
}
} static void wirtmsg1(object o)
{
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", o);
}
} static void wirtmsg2(object o)
{
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", o);
}
}
如果我这些线程都调用一个方法的话,显示的感觉执行的顺序又与分别调用不同方法的不一样。 迷茫中。。还希望各位帮帮小弟。。
static void Main(string[] args)
{
ParameterizedThreadStart p = new ParameterizedThreadStart(wirtmsg1);
ParameterizedThreadStart p1 = new ParameterizedThreadStart(wirtmsg2);
Thread t1 = new Thread(p1);
Thread t = new Thread(p);
t.Start(2);
t1.Start(3);
wirtmsg(1);
Console.ReadLine();
} static void wirtmsg(object o)
{
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", o);
}
} static void wirtmsg1(object o)
{
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", o);
}
} static void wirtmsg2(object o)
{
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", o);
}
}
如果我这些线程都调用一个方法的话,显示的感觉执行的顺序又与分别调用不同方法的不一样。 迷茫中。。还希望各位帮帮小弟。。
Running,Ready,Wait
三种状态顺序的转换,首先,某个线程创建,被放入wait队列,准备同步信号等变量,准备好后,放入Ready队列,当前Running的线程执行完一个时间片后,根据优先级插入到wait队列,此时从ready队列取出第一个线程,开始执行,当线程空闲时移到wait队列。
这就是为什么线程中使用Sleep(0)可以看上去明显的减少竞争的缘故,Sleep(0)强制的让线程进入wait队列,不继续占用cpu。你这里,每个循环都是占用cpu后,不释放,所以当他执行完毕后,才会有其他线程有机会运行。
如果是多核电脑可能会不同。
{
ParameterizedThreadStart ThreadProc = o =>
{
int id = (int)o;
for (int i = 0; i <= 10; i++)
{
Console.WriteLine("我是线程{0}", id);
Thread.Sleep(0);
}
};
new Thread(ThreadProc).Start(1);
new Thread(ThreadProc).Start(2);
new Thread(ThreadProc).Start(3);
Console.ReadKey();
}