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()方法.该状态的线程位于可运行线程池中, ...
随机推荐
- CALayer4-自定义层
一.自定义层的方法1 方法描述:创建一个CALayer的子类,然后覆盖drawInContext:方法,使用Quartz2D API进行绘图 1.创建一个CALayer的子类 2.在.m文件中覆盖dr ...
- ballerina 学习七 object 创建&& 初始化
在 ballerina 总中object 是一个包含public private 类型字段同时包含函数,需要开发人员进行自定义类型以及行为 说白了,就是类似面向对象的class 基本使用 代码 imp ...
- yugabyte cloud native db 基本试用
备注: 测试环境使用docker进行安装试用 1. 安装 a. Download mkdir ~/yugabyte && cd ~/yugabyte wget https://down ...
- 使用 openresty 修改请求内容
1. 目的 动态修改 html 页面内容 2. 使用方式 openresty 在 header_filter 阶段 以及body_filter 阶段进行数据修改 3. 源码 此 ...
- winform 多线程中ShowDialog()无效的解决办法
在使用Winform开发的过程,不可避免的要使用多线程,其中会在多线程中会调用窗口的ShowDialog方法,但实际上并不是模式窗口. private void Form1_Load(object s ...
- C#操作mysql数据库,往mysql读取或者写入数据
最近在开发的一个项目,需要将数据存贮在mysql数据库中,于是需要写一个操作mysql的帮助类,我采用的是官方的,还是先给出一个链接,后面有时间的话,继续更新. http://blog.csdn.ne ...
- RK3288 USB UVC camera 摄像头 VIDIOC_DQBUF Failed!!! err[I/O error]
RK3288 Android5.1 多个品牌USB摄像头 同一块主板和代码,大部分品牌的USB摄像头可以正常使用,只有某一款USB摄像头不能使用. 插上摄像头,底层可以识别到摄像头. &l ...
- centos7下安装docker 17.x
docker的17.X版本与以前的docker安装有些不同,参考了下这篇文章http://www.itmuch.com/docker/docker-2/,以下是我的docker 17.X版本安装过程, ...
- demo 2 chart 报表
function killerrors() { return true; } window.onerror = killerrors; //检查浏览器类型 function checkBrowser( ...
- 关于硬件实现FFT逆运算
前面的文章我们介绍了关于FFT的硬件实现.关于FFT的逆运算IFFT,其实就是将实现FFT的过程反过来执行就可以了. 在实现过程中要注意很多问题. 同 FFT一样,效率问题.以2048点为例,根据理论 ...