Thread thread1 = new Thread(new ThreadStart(c1.print));
Thread thread2 = new Thread(new ThreadStart(c2.print));
Thread thread3 = new Thread(new ThreadStart(c3.print));
thread1.Start();
thread2.Start();
thread3.Start();
当我运行上面的代码时,有时在线程1和线程2之前打印线程3,即使我指定thread1开始第1个。为什么会这样?
答案 0 :(得分:2)
仅仅因为你调用Start
并不意味着操作系统必须在那时启动线程。它会安排执行,最终它会得到一个允许它运行的时间片,但是这将是非确定性的。
此外,操作系统可以启动线程,然后决定暂停它,同时安排其他一些线程。这里的关键点是,如果线程之间有一个排序要求,那么编写代码就可以实现排序,而不是OS调度程序。
答案 1 :(得分:0)
查看this post中的示例
关键是你可以使用多个线程来分配工作,但是你永远不应该对它们运行的顺序有所期望。
线程可能会或可能不会按预期顺序启动。如果它们按预期顺序开始,则可能无法按预期顺序完全执行或完成。
阴险的“问题”是,他们将以预期的顺序执行,这导致程序员认为它正在做他们想要的事情。但是偶尔他们不会按顺序运行。重现或调试将很困难或不可能。