.Net最简单的创建多线程主线程等待所有线程执行完成的例子

简介: 多线程运行,主线程等待。 private static void Test2() { var waits = new List(); for (int i = 0; ...


多线程运行,主线程等待。

        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







相关文章
|
11天前
|
Java C# Python
线程等待(Thread Sleep)
线程等待(Thread Sleep)
|
11天前
|
测试技术
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
|
16天前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
33 1
|
16天前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
26 1
|
15天前
|
缓存 Linux 编译器
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
30 0
|
15天前
|
存储 Linux 调度
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
34 0
|
16天前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
20 0
|
16天前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
20 0
|
18天前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
19天前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信