场景: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. GB28181平台LiveGBS接入设备后设备树的目录结构展示

    GB28181流媒体服务 国标流媒体服务,支持本地|内网部署,下载试用入口 分屏展示->设备树 设备树为下级接入过来设备或平台原始的目录结构 分屏展示->分组 分组为自定义目录结构.可以右 ...

  2. UITextView文字添加链接和自定义选择内容后的菜单

    转载请注明出处!!! 1.OC版 self.textView.dataDetectorTypes = UIDataDetectorTypeAll; self.textView.editable = N ...

  3. 用智能体 1 分钟复刻百万点赞爆款视频文案,Coze工作流全流程拆解

    大家好,我是汤师爷,专注 AI 智能体分享,致力于帮助 100W 人用智能体创富~ 当前AI时代,信息爆炸,内容创作者面临着巨大的压力. 一方面,他们需要不断产出高质量内容:另一方面,创意枯竭和时间紧 ...

  4. Build in Public 拒绝闭门造车!这个方法让你的产品发布就自带流量

    什么是 Build in Public(公开构建)? 传统 Build 的方法: 躲在小黑屋里面,花6个月甚至一年的时间秘密开发,在这期间也不向外界透露任何消息,生怕创意被抄袭,直到产品达到完美状态, ...

  5. Vona ORM分表全攻略

    分表 针对高并发.数据量大的场景,通常会考虑采用分表机制进行优化.下面以 Model User/Order 为例,通过查询用户的订单列表,来演示分表的使用方法 分表规则 比如需要对订单表进行分表操作. ...

  6. raid强制上线后数据库无法启动故障处理

    联系:手机/微信(+86 13429648788) QQ(107644445) 标题:raid强制上线后数据库无法启动故障处理 作者:惜分飞版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究 ...

  7. Java中的final,权限修饰符与抽象类

    Java中的final,权限修饰符与抽象类 final 修饰方法:表明该方法是最终方法,不能被重写 修饰类:表明该类是最终类,不能被继承 修饰变量:叫做常量,只能被赋值一次 基本数据类型:变量的值不能 ...

  8. 现代 PHP8+ 实战特性介绍 Enums、Fibers 和 Attributes

    现代 PHP8+ 实战特性介绍 Enums.Fibers 和 Attributes PHP 一直是 Web 开发领域使用最广泛的语言之一.这些年来,它的特性不断演进,每个版本都让语言变得更有表现力.更 ...

  9. 上传图片后图片加载失败,或因后台ftp传输共享目录延迟导致获取不到

    在前端上传图片后,通过ajax传输至后台服务器,后台服务器通过ftp方式将文件发送至共享目录中,或因传输延迟或共享目录同步延迟导致前端无法获取到已上传的图片信息,这时需要对图片进行重新加载处理. 进行 ...

  10. magisk优秀模块列表 --- twrp-helper (twrp帮助器)

     让twrp支持内部存储备份https://github.com/Magisk-Modules-Repo/twrp-helper 一个Magisk模块,为设备的TWRP恢复镜像提供动态的热补丁,以便在 ...