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()方法.该状态的线程位于可运行线程池中, ...
随机推荐
- Oracle中用exp/imp命令快速导入导出数据
from: http://blog.csdn.net/wangchunyu11155/article/details/53635602 [用 exp 数 据 导 出]: 1 将数据库TEST完全导出, ...
- 在Eclipse中导入dtd和xsd文件,使XML自动提示
DTD 类型约束文件 1. Window->Preferences->XML->XML Catalog->User Specified Entries窗口中,选择Add ...
- pymongo和mongodbengine之间的区别
pymongo是一个mongo driver,可以用来连接数据库以及对数据库进行操作,但是是用mongo自己的用来操作数据库的语句进行操作数据库,而mongodbengine就像是sqlalchemy ...
- 基于C#的UDP协议的异步实现
一.摘要 总结UDP传输协议的异步实现. 二.实验平台 visual studio 2010 三.实验实例 服务器端代码: using System; using System.Collections ...
- GNU Radio安装教程: Ubuntu14.04 + uhd3.10.0 + gnuradio3.7.10.1
1. 更新和安装依赖项 在编译安装uhd和gnuradio之前,确保已安装所需依赖项.Ubuntu系统运行: sudo apt-get update 安装UHD和GNURadio所需依赖项: On U ...
- JAVA-Unit04: SQL(高级查询)
Unit04: SQL(高级查询) 查看SMITH的上司在那个城市工作? SELECT e.ename,m.ename,d.loc FROM emp e,emp m,dept d WHERE e.mg ...
- C#如何:启用和禁用自动绑定重定向 (微软)
https://msdn.microsoft.com/zh-cn/library/2fc472t2.aspx 如何:启用和禁用自动绑定重定向 .NET Framework (current versi ...
- cowboy的get和post的例子
官方get和post的代码是有问题的,1.1下运行crash,这里修改了下,贴代码 创建工程 rebar-creator create-app testCowboy testCowboy_app.er ...
- RTMP(实时信息传输协议)详解
RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing) ...
- appium在android7.0上无法启动问题
前言 由于最近很多android手机升级到7.0系统了,有些小伙伴的appium版本用的还是1.4版本,在运行android7.0的app自动化时候遇到无法启动问题:WebDriverExceptio ...