1、代码如下

// ***********************************************************************
// Assembly         : Share.Code.MultiThreadTest
// Author           : zhujinrong
// Created          : 11-20-2014
//
// Last Modified By : zhujinrong
// Last Modified On : 11-20-2014
// ***********************************************************************
// <copyright file="SumMultiThread2.cs" company="Microsoft">
//     Copyright (c) Microsoft. All rights reserved.
// </copyright>
// <summary></summary>
// ***********************************************************************using System;
using System.Collections.Generic;
using System.Threading;namespace Share.Code.MultiThreadTest
{/// <summary>/// 多线程求和/// </summary>public class SumMultiThread2{/// <summary>/// 子线程数量/// </summary>private int threadNum = 0;/// <summary>/// 待处理数据/// </summary>private List<int> dataList = new List<int>();/// <summary>/// 通知一个线程或多个线程正在发生的事情/// </summary>private List<ManualResetEvent> manualEventList = new List<ManualResetEvent>();/// <summary>/// 自动重置同步事件数组 /// </summary>private AutoResetEvent[] autoEvents;/// <summary>///  初始化同步事件/// </summary>private List<AutoResetEvent> tempEvents = new List<AutoResetEvent>();/// <summary>/// 手动重置同步事件 /// </summary>private ManualResetEvent manualEvent;/// <summary>/// 子线程结果/// </summary>private List<long> subSumList = new List<long>();/// <summary>/// 子线程结果/// </summary>private Dictionary<int, long> resultList = new Dictionary<int, long>();/// <summary>/// 构造函数/// </summary>/// <param name="dataList">数据</param>/// <param name="threadNum">线程个数</param>public SumMultiThread2(List<int> dataList, int threadNum){this.dataList = dataList;this.threadNum = threadNum;for (int i = 0; i < this.threadNum; i++){this.tempEvents.Add(new AutoResetEvent(false));}this.autoEvents = this.tempEvents.ToArray();this.manualEvent = new ManualResetEvent(false);}/// <summary>/// 执行结果/// </summary>public long Result{get;private set;}/// <summary>/// 执行/// </summary>public void Execute(){if (this.dataList == null || this.dataList.Count == 0 || this.threadNum == 0){return;}ThreadPool.QueueUserWorkItem(new WaitCallback(this.SetManualEvent));// 给每个线程分配数据List<List<int>> list = new List<List<int>>();for (int i = 0; i < this.threadNum; i++){list.Add(new List<int>());}for (int i = 0; i < this.dataList.Count; i++){list[i % this.threadNum].Add(this.dataList[i]);}for (int i = 0; i < this.threadNum; i++){Dictionary<int, List<int>> dic = new Dictionary<int, List<int>>();dic.Add(i, list[i]);ThreadPool.QueueUserWorkItem(new WaitCallback(this.ExecuteSum), dic);}// 等待所有自动事件终止 WaitHandle.WaitAll(this.autoEvents);long sum = 0;foreach (var item in this.resultList){sum += item.Value;}this.Result = sum;}/// <summary>/// 具体执行/// </summary>/// <param name="obj">对象</param>private void ExecuteSum(object obj){DateTime start = DateTime.Now;DateTime end = DateTime.Now;Dictionary<int, List<int>> dic = obj as Dictionary<int, List<int>>;int index = 0;foreach (var item in dic){index = item.Key;long sum = 0;if (item.Value != null && item.Value.Count > 0){foreach (var temp in item.Value){sum += temp;}}// this.subSumList.Add(sum);this.resultList.Add(index, sum);}end = DateTime.Now;Console.WriteLine("线程" + index + "执行完毕,耗时" + ((TimeSpan)(end - start)).TotalMilliseconds);this.autoEvents[index].Set();}/// <summary>/// 重置手动事件为终止状态 /// </summary>/// <param name="obj">obj</param>private void SetManualEvent(object obj){////重置手动事件为终止状态 this.manualEvent.Set();}}
}

2、测试

 public static void Test2(){List<int> list = new List<int>();for (int i = 0; i < 1000000; i++){list.Add(i);}DateTime start = DateTime.Now;DateTime end = DateTime.Now;long sum = 0;for (int i = 0; i < list.Count; i++){sum += list[i];}end = DateTime.Now;Console.WriteLine("主线程结果:" + sum + ",耗时:" + ((TimeSpan)(end - start)).TotalMilliseconds);start = DateTime.Now;SumMultiThread2 thread = new SumMultiThread2(list, 10);thread.Execute();end = DateTime.Now;Console.WriteLine("多线程结果是:" + thread.Result + ",耗时:" + ((TimeSpan)(end - start)).TotalMilliseconds);Console.Read();}

3、注意数据分配

转载于:https://www.cnblogs.com/tianxue/p/4110746.html

C#多线程学习-求和相关推荐

  1. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  2. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  3. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  4. C# 多线程学习总结

    C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程? 线程是 ...

  5. C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...

  6. 多线程学习-基础(四)常用函数说明:sleep-join-yield

    一.常用函数的使用 (1)Thread.sleep(long millis):在指定的毫秒内让当前正在执行的线程休眠(暂停执行),休眠时不会释放当前所持有的对象的锁. (2)join():主线程等待子 ...

  7. C#多线程学习之(五)使用定时器进行多线程的自动管理

    本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...

  8. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  9. C#多线程学习(三) 生产者和消费者

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

最新文章

  1. jdbc封装mysql_实用JDBC数据库查询封装
  2. 科技巨头纷纷从刷脸转向“刷手”,指纹如何扛起生物识别大旗?
  3. C 类INI文本,可以添加注释(初步实现,可以添加更加复杂的通用化设计)
  4. bat 调用python
  5. python3 dict 转 json 不ascii转码 去除空格
  6. 1、spring+quartz关闭Tomcat出现异常
  7. 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理
  8. zookeeper 入门讲解实例 转
  9. git 基本使用教程
  10. python读取lmdb文件_如何使用python創建LMDB文件
  11. SQL Server索引总结二
  12. 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法
  13. 皮卡丘为什么不进化_皮卡丘为什么不进化 真是原因让人感动哭
  14. Linux定时任务配置
  15. opencv 使用 GPU 加速
  16. (二)Gluster 架构部分(节-1)
  17. unity官方社区,来一起学习
  18. 计算机中c盘和硬盘有什么关系,都是硬盘分区 C盘和D盘到底有什么区别?
  19. C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
  20. 我的第一个Android应用软件——《飞鸟集》

热门文章

  1. 时间函数strtotime
  2. OpenSSH 服务器的 20 个最佳实践
  3. mysql InnoDB 行锁分析
  4. 关于Linux目录及文档权限的研究
  5. Hotmail怎么进不去?!
  6. PAT 乙级 1036. 跟奥巴马一起编程(15) Java版
  7. 计算机编程语言的分类,解释型语言、编译型语言、脚本语言的关系
  8. Eclipse console 编码设置
  9. angular cannot get /
  10. 提高xshell使用效率