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 = ; /// <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#多线程学习-求和的更多相关文章
- Java多线程学习笔记
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...
- 【转】C#多线程学习
C#多线程学习(一) 多线程的相关概念 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序 ...
- java多线程学习
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...
- Java多线程学习(吐血超详细总结)
本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...
- C#多线程学习(一) 多线程的相关概念(转)
什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄 ...
- Java多线程学习(转载)
Java多线程学习(转载) 时间:2015-03-14 13:53:14 阅读:137413 评论:4 收藏:3 [点我收藏+] 转载 :http://blog ...
- C#多线程学习之(五)使用定时器进行多线程的自动管理
本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理.分享给大家供大家参考.具体分析如下: Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执 ...
- [转] Qt 多线程学习
Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
随机推荐
- 《DSP using MATLAB》示例Example7.8
窗函数的设计思想就是选择一个理想的频率选择滤波器(通常其脉冲响应函数是 非因果.无限长的),然后截断(取窗)这个无限长脉冲响应,得到一个线性相位.因果的 FIR滤波器.频率域示意图如下: 我们的目的: ...
- 【mongodb】Mongodb初识
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
- [Luogu4630][APIO2018]Duathlon 铁人两项
luogu 题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行 ...
- NumPy-快速处理数据--矩阵运算
本文摘自<用Python做科学计算>,版权归原作者所有. 1. NumPy-快速处理数据--ndarray对象--数组的创建和存取 2. NumPy-快速处理数据--ndarray对象-- ...
- Unit02: jQuery事件处理 、 jQuery动画
Unit02: jQuery事件处理 . jQuery动画 jQuery实现购物车案例 <!DOCTYPE html> <html> <head> <titl ...
- OPCDAAuto.dll 的一个坑
最近项目需要对SCADA系统的下位机采集实时数据,常见做法是两种,一种采用ModBus RTU/TCP协议直接通过支持ModBus的下位机通信,一种是通过OPC规范,使用厂商提供的OPC Server ...
- IDEA開發 java web 初步
作爲一個小白,我也不知道爲啥同學們喜歡用IDEA開發,而不選擇eclipse,但是在項目學習中eclipse卻真的多次出現問題,無奈之下,本人也安裝了一個IDEA作爲學習使用.參考了博客開始使用這個工 ...
- centos7 yum 安装mysql
介绍在CentOS7上yum安装数据库服务器MySQL Community Server 5.7的方法. 准备 CentOS7默认安装了和MySQL有兼容性的MariaDB数据库,在我们安装MySQL ...
- PAT甲级 1002 A+B for Polynomials (25)(25 分)
1002 A+B for Polynomials (25)(25 分) This time, you are supposed to find A+B where A and B are two po ...
- 杂项:HTML5-1/3-发展历程
ylbtech-杂项:HTML5-1/3-发展历程 万维网的核心语言.标准通用标记语言下的一个应用超文本标记语言(HTML)的第五次重大修改(这是一项推荐标准.外语原文:W3C Recommendat ...