.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







相关文章
|
12天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
38 1
|
3天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
12天前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
65 2
|
15天前
|
存储 安全 Unix
并发编程基础:使用POSIX线程(pthread)进行多线程编程。
并发编程基础:使用POSIX线程(pthread)进行多线程编程。
47 0
|
18天前
|
存储 安全 Java
【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?
这篇文章探讨了在不使用`synchronized`和`Lock`的情况下保证线程安全的方法,包括使用`volatile`关键字、原子变量、线程本地存储(`ThreadLocal`)以及设计不可变对象。
【多线程面试题十二】、阻塞线程的方式有哪些?
线程阻塞的方式包括调用sleep()方法、阻塞式IO操作、等待同步监视器的获取、等待通知(notify),以及慎用的suspend()方法。
【多线程面试题 一】、 创建线程有哪几种方式?
创建线程的三种方式包括继承Thread类、实现Runnable接口和实现Callable接口,其中Runnable和Callable接口方式更受推荐,因为它们允许多重继承并更好地体现面向对象思想。
|
17天前
|
Java 调度
【多线程面试题 五】、 介绍一下线程的生命周期
线程的生命周期包括新建、就绪、运行、阻塞和死亡状态,线程状态会根据线程的执行情况在这些状态之间转换。
【多线程面试题 五】、 介绍一下线程的生命周期
|
20天前
|
Java
多线程线程同步
多线程的锁有几种方式