我想实现一个多线程系统(两个线程会这样做),我按照教程
Thread t1 = new Thread(new ThreadStart(threadA));
Thread t2 = new Thread(new ThreadStart(threadB));
t1.Start();
t2.Start();
输出对我来说意外,因为它显示:
“的ThreadA”
“的ThreadA”
“的ThreadA”
“threadB”
“threadB”
“threadB”。
我的代码有问题吗?非常感谢。
答案 0 :(得分:2)
缺点是线程在CLR和OS安排执行时执行,基于许多实现细节,这些细节因操作系统和操作系统以及CPU而异。
使用Thread类确实避免了ThreadPool,这是CLR对线程调度的大部分控制,但OS内核仍然决定线程何时运行。在你的情况下,每个Thread只是输出三行到控制台,完全可以预期一个线程会在操作系统开始之前完成另一个线程。
但是,您永远不能保证线程的运行顺序。因此,如果您要循环此代码(使用Join()语句)并运行100次,您可能会看到“threadA”和“threadB”的几种不同排列显示为操作系统在不同时间调度线程。如果两个欧盟在同一时间完全可用,则会出现重大的重叠;如果threadA被认为不如threadB重要,那么threadB可以在threadA开始之前完整地执行。
答案 1 :(得分:1)
这种情况正在发生,因为当您从t1.Start()
转到t2.Start()
时,您的t1
已经完成。
如果您希望稍微看一下代码
,请尝试这样的操作Thread t1 = new Thread(
new ThreadStart(()=>
{
for(int i = 0; i < 3; i++)
{
System.Console.WriteLine("ThreadA");
Thread.Sleep(3000)
}
}));
Thread t2 = new Thread(
new ThreadStart(()=>
{
for(int i = 0; i < 3; i++)
{
System.Console.WriteLine("ThreadB");
Thread.Sleep(1000)
}
}));
t1.Start();
t2.Start();
它应该打印出这样的东西:
ThreadA
ThreadB
ThreadB
ThreadA
ThreadB
ThreadA
但是,这只表明您在线程方面无法保证任何订单。