多线程运行,主线程等待。
private static void Test2() { var waits = new List<EventWaitHandle>(); for (int i = 0; i < 10; i++) { var handler = new ManualResetEvent(false); waits.Add(handler); new Thread(new ParameterizedThreadStart(Print)) { Name = "thread" + i.ToString() }.Start(new Tuple<int, EventWaitHandle>(i, handler)); } WaitHandle.WaitAll(waits.ToArray()); Console.WriteLine("All Completed!"); Console.Read(); } private static void Print(object param) { var p = (Tuple<int, EventWaitHandle>)param; Console.WriteLine(Thread.CurrentThread.Name + ": Begin!"); if (p.Item1 == 2) Thread.Sleep(1200); else if (p.Item1 ==1 ) Thread.Sleep(2000); else Thread.Sleep(1000); Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1); Console.WriteLine(Thread.CurrentThread.Name + ": End!"); p.Item2.Set(); }
附,一种变相多线程方法,Parallel.ForEach()或AsParallel():
并行 LINQ (PLINQ) 是 LINQ 模式的并行实现。 PLINQ 查询在许多方面类似于非并行 LINQ to Objects 查询。 PLINQ 尝试充分利用系统中的所有处理器, 它利用所有处理器的方法是,将数据源分成片段,然后在多个处理器上对单独工作线程上的每个片段并行执行查询。 在许多情况下,并行执行意味着查询运行速度显著提高。
private static void Test3() { var list=new List<int>(); for(int i=0;i<100;i++) { list.Add(i); } Console.WriteLine("test3 start\n" + DateTime.Now); //并行循环 Parallel.ForEach(list, (i) => { Thread.Sleep(100);//遍历每个数字,休眠0.1秒 //Console.WriteLine(i); }); Console.WriteLine("test3 end\n" + DateTime.Now); Console.ReadKey(); } private static void Test4() { var list = new List<int>(); for (int i = 0; i < 100; i++) { list.Add(i); } Console.WriteLine("test4 start\n" + DateTime.Now); //顺序循环 list.ForEach((i) => { Thread.Sleep(100);//遍历每个数字,休眠0.1秒 //Console.WriteLine(i); }); Console.WriteLine("test4 end\n" + DateTime.Now); Console.ReadKey(); }
附Parallel和普通循环执行结果:
分析:100个数,顺序一个一个执行,每个休眠100毫秒,总共 10秒。
而用Parallel并行计算,我电脑是2核4线程,应该是用了4线程,每4个同时执行,那100个就变成了100/4=25 次,共2.5秒,程序打印出来的时间,大概在2秒到3秒之间,估计得没错了。
Parallel适用于数据量大的情况(>10),如果数据少的话,还是不要用,因为使用硬件线程时,内部也是要用资源的。
要保证线程安全,一般使用对象:ConcurrentBag<T>来定义List类型集合。
Parallel更多用法,可参考:http://blog.csdn.net/sqlchen/article/details/26701403