一、类Thread的定义

public sealed partial class Thread : CriticalFinalizerObject

Thread类只继承了一个抽象类CritiacalFinalizerObject

二、Thread内部的定义的类

1、StartHelper类

1.1、类StartHelper的定义

private sealed class StartHelper

1.2、类StartHelper中的定义的字段

//该线程中允许使用的最大栈深
internal int _maxStackSize;
//该字段用于保存创建线程时传入的委托
internal Delegate _start;
//该字段用于保存通过调用start方法传入的参数(提供该给委托使用的参数)
internal object? _startArg;
//使用的文化信息
internal CultureInfo? _culture;
internal CultureInfo? _uiCulture;
//使用的执行上下文
internal ExecutionContext? _executionContext;
//public delegate void ContextCallback(object? state);
//internal delegate void ContextCallback<TState>(ref TState state);
//ContextCallback是一个委托声明
internal static readonly ContextCallback s_threadStartContextCallback = new ContextCallback(Callback);

1.3、类StartHelper中的方法

1.3.1、Run方法

[MethodImpl(MethodImplOptions.AggressiveInlining)] // avoid long-lived stack frame in many threads
internal void Run(){if (_executionContext != null && !_executionContext.IsDefault){//如果指定了执行上下文(_exectuionContext不为null,且不为默认的执行上下文),只是用指定的上下文执行委托ExecutionContext.RunInternal(_executionContext, s_threadStartContextCallback, this);}else{//如果没有指定的上下文或者指定的是默认的上文则直接调用RunWork执行委托RunWorker();}
}

注:ExecutionContext的相关内容见https://editor.csdn.net/md/?articleId=117068899

1.3.2、RunWorker方法

该方法中真正执行了委托

  [MethodImpl(MethodImplOptions.AggressiveInlining)] // avoid long-lived stack frame in many threads
private void RunWorker(){//初始化线程使用的语言环境InitializeCulture();//获取保存在StartHelper中的委托的副本Delegate start = _start;//清空_start_start = null!;#if FEATURE_OBJCMARSHALif (AutoreleasePool.EnableAutoreleasePool){//创建自动释放的poolAutoreleasePool.CreateAutoreleasePool();}
#endifif (start is ThreadStart threadStart){//如果传入的是不需要参数的委托,则直接运行委托threadStart();}else{//程序运行到这里说明创建thread实例时传入的是一个需要参数的委托ParameterizedThreadStart parameterizedThreadStart = (ParameterizedThreadStart)start;//获取有start方法传入的参数object? startArg = _startArg;_startArg = null;//执行委托parameterizedThreadStart(startArg);}
#if FEATURE_OBJCMARSHAL//如果该部分执行过程中出现了异常,进程会直接终止,所以没有必要将//该部分代码包裹在finally块中。if (AutoreleasePool.EnableAutoreleasePool){AutoreleasePool.DrainAutoreleasePool();}
#endif
}

1.3.3、Callback方法

 private static void Callback(object? state){Debug.Assert(state != null);//调用StartHelper对象的RunWorker方法((StartHelper)state).RunWorker();
}

2、值类型的ThreadHandle

 internal readonly struct ThreadHandle{private readonly IntPtr _ptr;internal ThreadHandle(IntPtr pThread){_ptr = pThread;}
}

二、Thread中定义的字段

//同步上下文
internal SynchronizationContext? _synchronizationContext; // maintained separately from ExecutionContext
//执行上下文
internal ExecutionContext? _executionContext;
//线程名
private string? _name;
//里面封装了创建Thread实例时传入的委托,以及执行委托的逻辑
private StartHelper? _startHelper;
#pragma warning disable CA1823, 169 // These fields are not used from managed.// IntPtrs need to be together, and before ints, because IntPtrs are 64-bit// fields on 64-bit platforms, where they will be sorted together.private IntPtr _DONT_USE_InternalThread; // Pointer//线程优先级private int _priority; // INT32//线程idprivate int _managedThreadId; // INT32
#pragma warning restore CA1823, 169
//如果当前线程是一个线程池线程,并且在执行任务的过程中线程的状态被修改了
//(name, background state, or priority等),则可以通过该标志快速判断是否需要重置线程的状态
private bool _mayNeedResetForThreadPool;

三、构造函数

//接收一个无参的委托
public Thread(ThreadStart start) {if (start == null) {//如果委托为null则抛出异常throw new ArgumentNullException(nameof(start));}//创建封装当前委托的StartHelper_startHelper = new StartHelper(start);//初始化Initialize();
}
//接收一个有参委托
public Thread(ParameterizedThreadStart start) {if (start == null) {throw new ArgumentNullException(nameof(start));}_startHelper = new StartHelper(start);Initialize();
}

构造函数中定义的Initialize方法是一个外部方法,其声明如下:

[MethodImpl(MethodImplOptions.InternalCall)]
private extern void Initialize();

四、Thread中start的方法

1、无参数的start

 public void Start() => Start(captureContext: true);private void Start(bool captureContext) {//获取当前的线程中的_startHelperStartHelper? startHelper = _startHelper;// In the case of a null startHelper (second call to start on same thread)// StartCore method will take care of the error reporting.if (startHelper != null) {//如果当前线程中的startHelper不为null表明该线程还没有被执行过//将参数置空startHelper._startArg = null;//如果需要使用相同的上下文执行接下类的任务则捕获当前线程中的executionContext,//否则当前线程的executionContext置空startHelper._executionContext = captureContext ? ExecutionContext.Capture() : null;}//StartCore();
}

2、有参数的start

public void Start(object? parameter) => Start(parameter, captureContext: true);
[UnsupportedOSPlatform("browser")]
public void UnsafeStart(object? parameter) => Start(parameter, captureContext: false);private void Start(object? parameter, bool captureContext) {StartHelper? startHelper = _startHelper;if (startHelper != null) {if (startHelper._start is ThreadStart) {//如果是无参的委托则抛出异常throw new InvalidOperationException(SR.InvalidOperation_ThreadWrongThreadStart);}//获取委托需要的参数startHelper._startArg = parameter;startHelper._executionContext = captureContext ? ExecutionContext.Capture() : null;}StartCore();
}

3、正式执行线程

//获取线程本地指针,并执行线程(或许可理解为将线程交给系统去处理)
private unsafe void StartCore(){lock (this) {fixed (char* pThreadName = _name){StartInternal(GetNativeHandle(), _startHelper?._maxStackSize ?? 0, _priority, pThreadName);}}
}//获取线程的本地指针
internal ThreadHandle GetNativeHandle() {IntPtr thread = _DONT_USE_InternalThread;// This should never happen under normal circumstances.if (thread == IntPtr.Zero) {throw new ArgumentException(null, SR.Argument_InvalidHandle);}//ThreadHandle封装了获取的thread的本地指针return new ThreadHandle(thread);
}

StartInternal是一个外部方法,其声明如下:

 [DllImport(RuntimeHelpers.QCall)]
private static extern unsafe void StartInternal(ThreadHandle t, int stackSize, int priority, char* pThreadName);

五、方法流程图

1、Thread中Start方法的流程图

2、StartHelper中Run方法的流程图

C# Thread详解相关推荐

  1. C++11 并发指南------std::thread 详解

    参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...

  2. python 线程thread详解

    join详解 看到代码示例时,都会出现一个join,这个作用如何?先看结论 阻塞主程序,专注于执行多线程中的程序 多线程多join的情况下,依次执行各线程的join方法,子线程全部结束了才能执行主线程 ...

  3. Java并发编程(一)Thread详解

    一.概述 在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系: 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位. 线程不能够独立执行,必须依存在应用程序中,由应用程 ...

  4. Java提高班(一)Thread详解

    一.概述 在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系: 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位. 线程不能够独立执行,必须依存在应用程序中,由应用程 ...

  5. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  6. Linux内核线程kernel thread详解--Linux进程的管理与调度

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

  7. 【C/C++开发】C++11 并发指南二(std::thread 详解)

    上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...

  8. std::thread详解

    转自:http://www.cnblogs.com/haippy/p/3236136.html 上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thr ...

  9. Java核心(一)线程Thread详解

    一.概述 在开始学习Thread之前,我们先来了解一下 线程和进程之间的关系: 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位. 线程不能够独立执行,必须依存在应用程序中,由应用程 ...

  10. C++11 并发指南二(std::thread 详解)

    上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...

最新文章

  1. 谷歌放弃python-老大离开Google,去了Dropbox
  2. return 与 exit()的区别--return退出本函数,exit()退出整个程序
  3. 顺序表应用5:有序顺序表归并
  4. 结合Pandas中的多个数据集
  5. 计算机丢失faultrep.dll,faultrep.dll
  6. 数据结构HashMap(Android SparseArray 和ArrayMap) 1
  7. Python 学习第一周
  8. java中undefined如何解决_js对undefined的处理
  9. 【平差软件学习---科傻】三、平面导线平差
  10. 2018年最新电子科技大学TCP/IP协议原理(杨宁)CSF视频教程42讲
  11. win10资源管理器explorer总是崩溃重启
  12. CentOS7安装配置BareOS备份工具
  13. Android音视频开发学习
  14. Android butterknife黄油刀使用大全
  15. python Deformation Transfer for Triangle Meshes
  16. 图像基本运算--图像合并
  17. 基于Kivy的HDR拍摄软件案例分享
  18. GIMP 快速入门(2)
  19. 自上而下面向能力的编程思想
  20. matplotlib sci论文画图技巧

热门文章

  1. collapse mode 严重_明早10点大讲堂 | 一个简单的方法解决生成对抗网络mode collapse问题...
  2. GIS应用类有哪些最新发表的毕业论文呢?
  3. 深圳华睿彩印高温玻璃打印机介绍
  4. PS:如何使用PS制作好看的文字图片,以CSDN分类专栏图标为例
  5. 斯坦福用算法降低:令欧洲头大的难民犯罪率
  6. 在VS Code中使用Clang-Format
  7. 某网站cookie加密黑盒调用与算法还原
  8. android 开启wifi代码,Android编程打开WiFi
  9. CMAQ-5.2安装及测试数据运行
  10. 企业网络:安全只能靠两招