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()方法.该状态的线程位于可运行线程池中, ...
随机推荐
- iOS设备是否越狱的判断代码
苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制.这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所.总体来说,越狱可以让我们随意安装.共享应用,但 ...
- pat甲级 1152 Google Recruitment (20 分)
In July 2004, Google posted on a giant billboard along Highway 101 in Silicon Valley (shown in the p ...
- 重温CLR(九) 接口
对于多继承(multiple inheritance)的概念,许多程序员并不陌生,他是指一个类从两个或多个基类派生的能力.例如,假定TransmitData类的作用是发送数据,ReceiveData类 ...
- 《DSP using MATLAB》示例Example 8.17
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 2018HN省队集训
HNOI2018省队集训 Day 1 流水账 T1 tree 换根+求\(lca\)+求子树和,一脸bzoj3083遥远的国度的既视感.子树和讨论一下就好了,\(lca\)?也是大力讨论一波. 先写了 ...
- cell的循环利用
方式1 // 1.先根据cell的标识去缓存池中查找可循环利用的cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdent ...
- hessian+spring集成应用
注意事项 ▲JAVA服务器端必须具备以下几点:---->包含Hessian的jar包---->设计一个接口,用来给客户端调用---->实现该接口的功能---->配置web.xm ...
- Python 函数 -hasattr()
hasattr(object, name)hasattr() 函数用于判断对象是否包含对应的属性.如果对象有该属性返回 True,否则返回 False.object -- 对象.name -- 字符串 ...
- 通过修改注册表建立Windows自定义协议
引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...
- 在Mac和win7上分别安装了docker后,发现原来的vagrant都启动不了了
在Mac和win7上分别安装了docker后,发现原来的vagrant都启动不了了 liugx@liugx vagrant$ vagrant up /opt/vagrant/embedded/gems ...