C#多线程学习-求和
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#多线程学习-求和相关推荐
- Java多线程学习处理高并发问题
在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...
- C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- 艾伟:C#多线程学习(六) 互斥对象
本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...
- C# 多线程学习总结
C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程? 线程是 ...
- C#多线程学习(二) 如何操纵一个线程
C#多线程学习(二) 如何操纵一个线程 原文链接:http://kb.cnblogs.com/page/42529/ [1] C#多线程学习(二) 如何操纵一个线程 [2] C#多线程学习(二) 如何 ...
- 多线程学习-基础(四)常用函数说明:sleep-join-yield
一.常用函数的使用 (1)Thread.sleep(long millis):在指定的毫秒内让当前正在执行的线程休眠(暂停执行),休眠时不会释放当前所持有的对象的锁. (2)join():主线程等待子 ...
- C#多线程学习之(五)使用定时器进行多线程的自动管理
本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...
- java多线程学习-java.util.concurrent详解
http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...
- C#多线程学习(三) 生产者和消费者
C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...
最新文章
- jdbc封装mysql_实用JDBC数据库查询封装
- 科技巨头纷纷从刷脸转向“刷手”,指纹如何扛起生物识别大旗?
- C 类INI文本,可以添加注释(初步实现,可以添加更加复杂的通用化设计)
- bat 调用python
- python3 dict 转 json 不ascii转码 去除空格
- 1、spring+quartz关闭Tomcat出现异常
- 使用 mock 数据在本地运行 SAP Fiori Elements 应用的工作原理
- zookeeper 入门讲解实例 转
- git 基本使用教程
- python读取lmdb文件_如何使用python創建LMDB文件
- SQL Server索引总结二
- 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法
- 皮卡丘为什么不进化_皮卡丘为什么不进化 真是原因让人感动哭
- Linux定时任务配置
- opencv 使用 GPU 加速
- (二)Gluster 架构部分(节-1)
- unity官方社区,来一起学习
- 计算机中c盘和硬盘有什么关系,都是硬盘分区 C盘和D盘到底有什么区别?
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
- 我的第一个Android应用软件——《飞鸟集》