场景:1~1000累加求和

只考虑如何启用多线程计算,不考虑线程同步

实现方式:

1.Thread thread=new Thread(new ThreadStart(some delegate)); 无参数启动新线程。

2.Thread thread=new Thread(new ParameterizedThreadStart(some delegate,params)); 带参数启动新线程。

3.将线程操作封装为一个独立方法,其中使用匿名方法的方式将外部参数导入。

4.ThreadPool.QueueUserWorkItem(delegeate,params)带参数的线程池方法,

注意线程池中分配的线程都是background线程,主线程终止会导致子线程终止。

5.Task,都多重方式,底层使用的Threadpool,需要使用wait方法阻塞主线程。

6.构造一个包含参数、操作的类,通过类的属性将参数传递给操作。

7.通过委托的方式,可以传参,并且可以有返回值。

以上除了委托方式,其他可以传参的方式,都可以通过把返回值封装在参入参数中,使用引用的方式获得返回值。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace multithreadTest
{
class Program
{
static Stopwatch watch = new Stopwatch();
static int length = 100;
static int count;
static void Main(string[] args)
{ Console.WriteLine("Main Thread:{0}", Thread.CurrentThread.ManagedThreadId);
//CaculateSum();
//NoInputAndReturn();
//MultiInputNoReturn_Anonymous();
//MultiInputNoReturn_ParameterizedThread();
//MultiInputNoReturn_ThreadPool();
MultiInputNoReturn_Task();
//MultiInputNoReturn_UseClassProperty();
//MultiInputWithReturn_Delegate();
Console.WriteLine("Main Thread Exit:{0}", Thread.CurrentThread.Name);
} #region 没有输入,没有返回
/// <summary>
/// 没有输入,没有返回
/// </summary>
public static void NoInputAndReturn()
{
ThreadStart ts = new ThreadStart(CaculateSum);
Thread thread=new Thread(ts);
thread.Start();
} /// <summary>
/// 1~1000求和 无输入 无返回
/// </summary>
public static void CaculateSum()
{
watch.Reset();
watch.Start();
Console.WriteLine("IsBackground:{0}", Thread.CurrentThread.IsBackground);
Console.WriteLine("Thread Start:{0}", Thread.CurrentThread.ManagedThreadId);
int count = 0;
for (var i = 0; i <= 1000; i++)
{
count += i;
Thread.Sleep(5);
}
watch.Stop();
Console.WriteLine("Thread Exit:{0},Count:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, count, watch.Elapsed);
}
#endregion #region 多输入 无返回
#region 匿名方法
/// <summary>
/// 多输入 无返回 匿名方法
/// </summary>
public static void MultiInputNoReturn_Anonymous()
{
for(var i=0;i<1000;i+=(length+1))
{
CaculateSum_Anonymous(i, i + length > 1000 ? 1000 : i + length);
}
} /// <summary>
/// start~end求和 匿名方法方式
/// </summary>
/// <returns></returns>
public static void CaculateSum_Anonymous(int start, int end)
{
Thread t = new Thread(new ThreadStart(delegate() {
watch.Reset();
watch.Start();
int count = 0;
for (var i = start; i <= end; i++)
{
count += i;
Thread.Sleep(5);
}
watch.Stop();
Console.WriteLine("Thread Exit:{0},Count:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, count, watch.Elapsed);
}));
t.Start();
}
#endregion class StartEnd
{
public int start;
public int end;
} #region ParameterizedThread包装参数 public static void MultiInputNoReturn_ParameterizedThread()
{
for (var i = 0; i < 1000; i += (length+1))
{
ParameterizedThreadStart ts = new ParameterizedThreadStart(CaculateSum_ParameterizedThread);
Thread thread = new Thread(ts);
thread.Start(new StartEnd() { start = i, end = i + length > 1000 ? 1000 : i + length });
}
} /// <summary>
/// 0~end求和 一个参数 无返回
/// </summary>
/// <returns></returns>
public static void CaculateSum_ParameterizedThread(object se)
{
watch.Reset();
watch.Start();
var start=((StartEnd)se).start;
var end=((StartEnd)se).end;
int count = 0;
for (var i =start ; i <= end; i++)
{
count += i;
Thread.Sleep(5);
}
watch.Stop();
Console.WriteLine("Thread Exit:{0},Count:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, count, watch.Elapsed);
}
#endregion #region ThreadPool 包装参数
public static void MultiInputNoReturn_ThreadPool()
{
for (var i = 0; i < 1000; i += (length + 1))
{
ThreadPool.QueueUserWorkItem(CaculateSum_ParameterizedThread,
new StartEnd() { start = i, end = i + length > 1000 ? 1000 : i + length });
} //threadpool中的线程都是background的,如果主线程提前终止,会终止子线程的操作
Console.WriteLine("Main thread does some work, then sleeps.");
Thread.Sleep(5000); Console.WriteLine("Main thread exits.");
}
#endregion #region Task 包装参数
public static void MultiInputNoReturn_Task()
{
for (var i = 0; i < 1000; i += (length + 1))
{
Task t = new Task(CaculateSum_ParameterizedThread, new StartEnd() { start = i, end = i + length > 1000 ? 1000 : i + length });
t.Start();
//Task是基于线程池的,如果不使用wait会被主线程终止
t.Wait();
}
Console.WriteLine("Main thread does some work, then sleeps."); Console.WriteLine("Main thread exits.");
}
#endregion #region 通过类属性
/// <summary>
/// 多输入 无返回 通过类属性
/// </summary>
public static void MultiInputNoReturn_UseClassProperty()
{
for (var i = 0; i < 1000; i += (length+1))
{
var sum = new SumTest();
ThreadStart start = new ThreadStart(sum.GetSum);
sum.Start = i;
sum.End = i + length > 1000 ? 1000 : i + length;
Thread t = new Thread(start);
t.Start();
}
} public class SumTest
{
public int Start;
public int End; public void GetSum()
{
watch.Reset();
watch.Start();
int count = 0;
for (var i = this.Start; i <= this.End; i++)
{
count += i;
Thread.Sleep(5);
}
watch.Stop();
Console.WriteLine("Thread Exit:{0},Count:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, count, watch.Elapsed);
}
} #endregion
#endregion #region 传参 有返回 委托 delegate TimeSpan GetSumMethod(int start, int end);
static GetSumMethod getSum;
public static void MultiInputWithReturn_Delegate()
{
int count=0;
TimeSpan ts = new TimeSpan();
for (var i = 0; i < 1000; i += (length+1))
{
GetSumMethod getSumMethod = CaculateSum;
getSumMethod.BeginInvoke(i, i + length > 1000 ? 1000 : i + length,
new AsyncCallback(delegate(IAsyncResult result) { ts += getSumMethod.EndInvoke(result); }), null);
} Thread.Sleep(6000);
Console.WriteLine("TimeSpan:{0}", ts);
Console.ReadKey();
} public static TimeSpan CaculateSum(int start, int end)
{
watch.Reset();
watch.Start();
Console.WriteLine("Thread Start:{0}", Thread.CurrentThread.ManagedThreadId);
int count = 0;
for (var i = start; i <= end; i++)
{
count += i;
Thread.Sleep(5);
}
watch.Stop();
Console.WriteLine("Thread Exit:{0},Count:{1},Time:{2}", Thread.CurrentThread.ManagedThreadId, count, watch.Elapsed);
return watch.Elapsed;
} #endregion }
}

c# 多线程概览的更多相关文章

  1. iOS 多线程详解

    iOS开发 多线程 概览 机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发: 对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其 ...

  2. 【Java多线程】线程同步方法概览

    一:使用syncrhoized内置锁实现同步 使用互斥来实现线程间的同步,保证共享数据在同一时刻只被一个线程使用.Java中最基本的互斥手段就是syncrhoized关键字. syncrhoized的 ...

  3. C# - 多线程 之 信号系统

    基础概览 多线程之信号系统命名空间 using System.Threading; 线程同步类的继承层次关系图 终止状态和非终止状态 在终止状态下,被WaitOne()阻塞的线程会逐个得到释放.如果一 ...

  4. Zookeeper C API 指南四(C API 概览)(转)

    上一节<Zookeeper C API 指南三(回调函数)>重点讲了 Zookeeper C API 中各种回调函数的原型,本节将切入正题,正式讲解 Zookeeper C API.相信大 ...

  5. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  6. Java并发编程实现概览

    并发概览 >>同步 如何同步多个线程对共享资源的访问是多线程编程中最基本的问题之一.当多个线程并发访问共享数据时会出现数据处于计算中间状态或者不一致的问题,从而影响到程序的正确运行.我们通 ...

  7. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

  8. C#与C++、Java之比较概览

    转自C#与C++.Java之比较概览 C#与C++.Java之比较概览 Ben Albahari 著  荣耀 译 本文翻译时间较早.欢迎指出任何误失.谢谢. 感谢以下人士的支持和反馈(按字母先后顺序) ...

  9. OSG开发概览(转载)

    OSG开发概览 1 OSG基础知识 Ø OSG是Open Scene Graphic 的缩写,OSG于1997年诞生于以为滑翔机爱好者之手,Don burns  为了对滑翔机的飞行进行模拟,对open ...

  10. java多线程一览

    线程概述: 多线程的目的,不是提高程序的执行速度,而是提高程序的使用率(能抢到CPU的可能比较大). 因为线程是CPU调度的基本单位,所以,当一个程序的线程较多的时候就更容易抢到cpu的资源 进程: ...

随机推荐

  1. mongoose之模块化使用

    目录结构 module db.js user.ja app.js db.js const mongoose = require('mongoose') mongoose.connect('mongod ...

  2. Linux下使用iVerilog进行Verilog开发

    一.iVerilog的安装 首先要在Linux中安装iVerilog 这里提供两种方式: 方法一: sudo apt-get install iverilog 方法二: 下载iVerilog源码 gi ...

  3. 【GitHub每日速递 250916】2053 个 n8n 工作流曝光!365 种集成 + 可视化管理,效率直接拉满

    原文:[GitHub每日速递 250916]2053个n8n工作流曝光!365种集成+可视化管理,效率直接拉满 Codebuff:开源AI编码助手,多模型协作胜Claude Code,还能深度自定义! ...

  4. 问界M9同款“黑科技”上车,智界S7堪称“全能战士”

    坊间一直流传着这样一句话:没有人能空着手从华为门店里走出来. 这是对华为的产品和服务坚持以客户为中心.致力满足千人千面需求的最高评价.对于这一观点,作为经常逛华为门店的科技自媒体,懂懂笔记也是高度认同 ...

  5. PWN手成长之路-06-watevr_2019_voting_machine_1-栈溢出+劫持

    远程连接,看一下交互.发现是一个投票系统,让用户在0-10之间选择一个数字并输入. file 查看文件.64 位 ELF 可执行文件. checksec 查看文件安全属性.开启了 NX 保护,栈上无执 ...

  6. 高速视频采集卡设计方案:620-基于PCIe的高速视频采集卡

    一.产品概述 基于PCIe的高速视频采集卡,通过PCIe3.0X8传输到存储计算服务器,实现信号的分析.存储.       北京太速科技 产品固化FPGA逻辑,适配视频连续采集,缓存容量2GB,开源的 ...

  7. 解决oracle数据文件路径有回车故障---惜分飞

    联系:手机/微信(+86 17813235971) QQ(107644445) 标题:解决oracle数据文件路径有回车故障 作者:惜分飞版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法 ...

  8. Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

    在IDEA中对SpringBoot项目打包maven打war包项目的时候提示: Error assembling WAR: webxml attribute is required (or pre-e ...

  9. 诚清单v2版本现已在github/gitee上开源

    Github地址:https://github.com/nainai23012/chengqingdan_v2 Gitee地址:https://gitee.com/dayelang/chengqing ...

  10. m基于Q-Learning强化学习的迷宫路线规划策略matlab仿真

    1.算法仿真效果 matlab2022a仿真结果如下: 2.算法涉及理论知识概要 Q-Learning是一种无模型的强化学习算法,它能够使代理(Agent)在与环境互动的过程中学习最优策略,无需了解环 ...