for (int i = 0; i < 10; i++) { new Thread(new ParameterizedThreadStart(id => { Thread.Sleep(1000); Console.WriteLine("THREAD:" + DateTime.Now.ToString() + "," + id); })).Start(i); } Thread.Sleep(5000); for (int i = 0; i < 10; i++) { new Task(id => { Thread.Sleep(1000); Console.WriteLine("TASK:"+DateTime.Now.ToString() + "," + id); }, i).Start(); }
得到的结果是
THREAD:2014/6/9 16:51:07,0 THREAD:2014/6/9 16:51:07,2 THREAD:2014/6/9 16:51:07,3 THREAD:2014/6/9 16:51:07,4 THREAD:2014/6/9 16:51:07,5 THREAD:2014/6/9 16:51:07,1 THREAD:2014/6/9 16:51:07,6 THREAD:2014/6/9 16:51:07,7 THREAD:2014/6/9 16:51:07,8 THREAD:2014/6/9 16:51:07,9 TASK:2014/6/9 16:51:12,0 TASK:2014/6/9 16:51:12,1 TASK:2014/6/9 16:51:13,3 TASK:2014/6/9 16:51:13,2 TASK:2014/6/9 16:51:13,4 TASK:2014/6/9 16:51:14,5 TASK:2014/6/9 16:51:14,6 TASK:2014/6/9 16:51:14,7 TASK:2014/6/9 16:51:15,8 TASK:2014/6/9 16:51:15,9
问题就来了,为什么task和thread不一样?不是10个task同时执行的??竟然还是按照顺序来的???
你咋知道是按照顺序执行的?
我的意思就是他没有和 thread一样啊,应该是10个同时运行,然后同一时间结束啊,为什么10个task不是同一时间结束?
@wdwwtzy: 请给出“同时运行”、“同一时间结束”的定义?再你继续提问之前,可否请你去认真的读一下《操作系统》这本书,掌握些基础知识对你没有坏处。
谁告诉你多线程是多个线程同时执行了.
你的CPU有几个核心,或者说几个线程,就能同时处理几个线程.至于顺序不顺序的,那本来就是不确定的.不能当真的
thread是啊
@wdwwtzy: ````你对多线程的理解是错误的.就算以你的想法,多个线程可以同时执行,但每个线程都是从主线程生成的.也就是说子线程的生成都是顺序的,那由于生成时的时间差,执行时自然就会有时间差了.
你先去了解下CPU是怎么执行线程的吧.
如果你的CPU有2个核心.那么你的系统就只能同时执行2个线程,如果系统中所有线程的数量超过2个,CPU核心就会在不同的线程之间切换,以实现多线程处理.但是是切换执行,而不是同时执行
从你的输出来看,也不是顺序执行的呀~
我的意思就是他没有和 thread一样啊,应该是10个同时运行,然后同一时间结束啊,为什么10个task不是同一时间结束?
@wdwwtzy: 多线程只是说任务可以并行,猜单核处理上,同一时间还是只有一个线程再跑呢。并没有要求同时开始,同时结束啊。不管你是Task还是Thread,都不是同时的。
0、1、3、2、4这是顺序?
我的意思就是他没有和 thread一样啊,应该是10个同时运行,然后同一时间结束啊,为什么10个task不是同一时间结束?
应该是Thread.sleep()函数的问题吧,我记得这个函数不影响线程内部的啊,所以你所有的输出都是一个时间,你去查查吧。
你里面用this.sleep()看看,我也不记得了。
你换成100个1000个试试,10个不能说明问题的,没准是凑巧呢