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 = ; /// <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 = ; 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 == || this.threadNum == )
{
return;
} ThreadPool.QueueUserWorkItem(new WaitCallback(this.SetManualEvent)); // 给每个线程分配数据
List<List<int>> list = new List<List<int>>();
for (int i = ; i < this.threadNum; i++)
{
list.Add(new List<int>());
} for (int i = ; i < this.dataList.Count; i++)
{
list[i % this.threadNum].Add(this.dataList[i]);
} for (int i = ; 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 = ;
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 = ;
foreach (var item in dic)
{
index = item.Key;
long sum = ;
if (item.Value != null && item.Value.Count > )
{
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 = ; i < ; i++)
{
list.Add(i);
} DateTime start = DateTime.Now;
DateTime end = DateTime.Now;
long sum = ;
for (int i = ; 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, );
thread.Execute();
end = DateTime.Now;
Console.WriteLine("多线程结果是:" + thread.Result + ",耗时:" + ((TimeSpan)(end - start)).TotalMilliseconds); Console.Read();
}

3、注意数据分配

C#多线程学习-求和的更多相关文章

  1. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  2. 【转】C#多线程学习

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

  3. java多线程学习

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...

  4. Java多线程学习(吐血超详细总结)

    本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...

  5. C#多线程学习(一) 多线程的相关概念(转)

    什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄 ...

  6. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

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

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

  8. [转] Qt 多线程学习

    Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...

  9. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

随机推荐

  1. RabbitMQ介绍及windows下安装使用

    RebbitMQ介绍 RabbitMQ是一个由 Erlang (一种通用的面向并发的编程语言)开发的AMQP(Advanced Message Queue )的开源实现,Rabbit MQ 是建立在E ...

  2. 【DUBBO】 Dubbo生成的设配类

    package com.alibaba.dubbo.rpc;import com.alibaba.dubbo.common.extension.ExtensionLoader;public class ...

  3. 如何在CentOS系统中安装配置SNMP服务

    CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,现在有一大部分服务器在使用此操作系统:SNMP(简单网络 ...

  4. (QPS)TPS指标概述

    性能测试关注指标-TPS概述 一.TPS(Transaction per Second)定义 TPS是Transactions Per Second 的缩写,也就是事务数/秒.它是软件测试结果的测量单 ...

  5. 嵌入式linux问题杂锦

    tftp 在开发板上不能获取共享文件,出现: Permission denied tftp: can't open 'myTcpTest': Permission denied 是因为,我在/sys目 ...

  6. Android screencap截屏指令

    查看帮助(注意:有的网友错误使用 screencap -v ,结果差不多,因为系统不能识别-v,就自动打印出帮助信息) # screencap -hscreencap -husage: screenc ...

  7. JAVA-Unit05: 视图、序列、索引 、 约束

    Unit05: 视图.序列.索引 . 约束 视图 数据库对象之一 视图在SQL语句中体现的角色与表相同, 但它并非一张真实存在的表,它对应的 是一个查询语句的结果集. 创建一个查看10号部门员工信息的 ...

  8. 高德js API根据出行方式和出现策略由起始点经纬度实现路线规划

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...

  9. ElasticSearch所使用的倒排索引的思想和使用场景

    背景: 在关系数据库系统里,索引是检索数据最有效率的方式,.但对于搜索引擎,它并不能满足其特殊要求: 1)海量数据:搜索引擎面对的是海量数据,像Google,百度这样大型的商业搜索引擎索引都是亿级甚至 ...

  10. Thread之六:线程创建方法

    1.继承Thread类,重写该类的run()方法. 2.实现Runnable接口,并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例,并以此实例作为Thr ...