问题描述
intnum=10;ManualResetEvent[]ms=newManualResetEvent[num];for(inti=0;i<num;i++){ms[i]=newManualResetEvent(false);}for(inti=0;i<num;i++){ThreadPool.QueueUserWorkItem(delegate(objectobj){intindex=Convert.ToInt32(obj);Thread.Sleep(5000);ms[index].Set();},i);}WaitHandle.WaitAll(ms);MessageBox.Show("运行结束");如果线程池中的线程是并发运行的话,那么应该就是在5秒钟后运行结束,但是实际不是这样
解决方案
解决方案二:
这个很正常,线程池启动需要一点点时间,更何况,线程池的数量是.net控制的,不会一下帮你开10个的,所以不会再5s的时候结束。
解决方案三:
那用了多长时间?
解决方案四:
退一步讲,就算Net给你创建了10个独立线程执行(正常应该不会),你的CPU有10核去同时执行这10个线程吗?没有的话,还不是CPU给你分配时间片,一个线程执行一会,5秒肯定不会结束
解决方案五:
引用3楼wjkaola123的回复:
退一步讲,就算Net给你创建了10个独立线程执行(正常应该不会),你的CPU有10核去同时执行这10个线程吗?没有的话,还不是CPU给你分配时间片,一个线程执行一会,5秒肯定不会结束
说的到位了我在代码上加了时间显示,你看下就明白了intnum=10;ManualResetEvent[]ms=newManualResetEvent[num];Console.WriteLine("{0,-15}--------START--------",DateTime.Now);for(inti=0;i<num;i++){ms[i]=newManualResetEvent(false);}for(inti=0;i<num;i++){ThreadPool.QueueUserWorkItem(delegate(objectobj){intindex=Convert.ToInt32(obj);Console.WriteLine("{0,-15}{1}SLEEP",DateTime.Now,index);Thread.Sleep(5000);Console.WriteLine("{0,-15}{1}AWAKE",DateTime.Now,index);ms[index].Set();},i);}WaitHandle.WaitAll(ms);Console.WriteLine("{0,-15}--------STOP--------",DateTime.Now);
解决方案六:
引用4楼qqamoon的回复:
说的到位了我在代码上加了时间显示,你看下就明白了
不用考虑时间显示。你可以在你的第一个出现的“AWAKE”之前数一下一共出现了多少个"SLEEP”,就知道当前系统线程池中有多少你所注册任务在“并发”执行。另外,你把Thread.Sleep(5000)再改为Thread.Sleep(8000)看看线程池又给你分配了多少并发数量。
解决方案七:
线程池中会并发执行你的全部10个任务,这没有问题,这跟CPU核心数没有关系。但是线程池会延迟启动任务,而不会一股脑地将所有任务同时启动。这是优化性能的手段。
解决方案八:
哦,我还以为#4楼是lz的自己的跟帖。要看“并发数”,不要绕道“时间”去看,那样反而不容易数清楚并发数。应该设计一个int变量来统计。