1、System.Threading命名空间

System.Threading命名空间提供了使得可以多线程编程的类和接口

其中

(1)Thread类构成了C#多线程编程的支柱,他用于创建并控制线程

(2)ThreadStart是一个委托,派生自System.MuliticastDelegate,通过ThreadStart来创建线程调用方法的引用,并且将该引用通过创建一个Thread类型的对象来创建一个线程

(3)ThreadPriority和ThreadState是枚举,派生自Enum,表示线程的优先级和线程的状态

(4)ThreadAbortException和StateException是定义的异常类,派生自SystemException

2、创建和启动线程

ThreadStart是一个委托  语法是:delegate void ThreadStart()

线程被启动之后,该线程就会进入就绪状态,等待CPU资源

3、Thread类

Sleep()方法设置将当前线程暂停或阻塞的毫秒数,在设定的时间后,线程会进入就绪状态,等待系统进行调度。Sleep方法只对当前执行的线程起作用!

这里还涉及两个方法Suspend()和Resume()方法,分别是挂起线程和继续已挂起的线程,虽然这功能很好,但是由于这两个方法运行会出现不可预料的结果,因此不建议使用。并且,微软已经将这两个方法标记为过时,在未来版本中不再使用。

Abort()方法会终止线程

Join()方法用于阻塞调用线程,直到某个线程终止时为止,如果不懂Join方法,可以参看本笔记的详细说明

Thread类的Join()方法能够将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,线程A将插入线程B之前,直到线程A执行完毕后,才会继续执行线程B。

4、线程的生命周期

******重要部分******************

线程有下面的几个状态:未启动、开始(即等待)、运行、挂起、停止。

当一个Thread类的实例被创建时,线程进入未启动状态

当调用了Start()方法之后,线程进入就绪(或等待)状态,即等待CPU资源,一旦这个线程得到了CPU资源,那么就进入运行状态

某一个线程完成以后,就正常的进入停止状态

线程通过Abort()方法强行的令其终止,最后进入停止状态

线程通过Sleep()方法或Join()方法来进入休眠或阻塞状态,休眠和阻塞状态的线程也能回到运行状态。

1、让一个线程进入睡眠状态

当我们创建一个线程后,我们需要调用线程对象的Start()方法来调度那个线程。在这时,CLR将会为作为构造函数参数传递给线程对象的方法地址分配一个时间片。一旦线程开始执行,它就可以在操作系统处理其他线程时回到睡眠状态或者退出状态。

我们可以使用线程类的Sleep()方法让一个线程进入睡眠状态。如果你正在等待一个资源并且你想在稍后继续尝试访问这个资源时,Sleep()方法是很重要的。举个例子,假设你的程序由于无法访问需要的资源而导致其不能继续执行时,你可能想要在几毫秒之后尝试继续访问资源,在这种情况下让线程在再次尝试访问资源之前睡眠一段时间是一个很好的方式。

Sleep()方法有两种重载方式。

第一种重载方法有一个整型参数,并会按照指定的毫秒时间暂停线程执行。例如,如果你向线程传递值100,那么线程将会暂停100毫秒。这个方法将会让线程进入WaitSleepJoin状态。

第二种重载方法有一个TimeSpan类型参数,当前线程会按照TimeSpan的值暂停一段时间。TimeSpan是System命名空间中的一个类。TimeSpan有一些很有用的属性并会返回基于时钟时间间隔。我们可以使用FromSeconds()和FromMinutes()来确定睡眠时间。

2、终止一个处于Sleep或Join状态的线程

当让一个线程睡眠时,它实际会进入WaitSleepJoin状态。如果线程处于睡眠状态,那么在它超时退出之前唯一可以唤醒线程的方式是使用Interrupt()方法。Interrupt()方法将让线程回到调度队列中去。

当计数器的值为10, 20 和 30 时第一个线程会睡眠。第二个线程会检查第一个线程是否已经进入睡眠状态。如果是的话,它将中断第一个线程并使它回到调度队列中去。Interrupt()方法是让睡眠线程重新醒来的最好方式,当线程等待的资源可用且你想让线程继续运行时你可以使用这个方法

5、线程传参

有两种方法:

(1)使用ParameterizedThreadStart委托

该委托的语法:

当我们使用Thread类创建线程的时候,在Thread类的构造里就可以传一个ParameterizedThreadStart对象,这样我们在启动(Start)该线程的时候就可以调用Start方法的带object类型参数的版本,即在启动线程时为线程传参

(2)将线程调用的方法定义为实例方法

6、线程优先级

这里要澄清一个问题,线程优先级高,只是意味着优先级高的线程占有更多的cpu时间,并不意味着一定会优先执行完优先级高的线程。

操作系统有他的线程调度算法,因此不能保证操作系统会接受设置的优先级,毕竟操作系统还有其他的线程,不仅仅是只执行你程序的线程。

2、在NET中实现多线程的更多相关文章

  1. 细说.NET 中的多线程 (一 概念)

    为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在不同的线程中进行. ...

  2. 细说.NET中的多线程 (二 线程池)

    上一章我们了解到,由于线程的创建,销毁都是需要耗费大量资源和时间的,开发者应该非常节约的使用线程资源.最好的办法是使用线程池,线程池能够避免当前进行中大量的线程导致操作系统不停的进行线程切换,当线程数 ...

  3. [转载]ArcGIS Engine 中的多线程使用

    ArcGIS Engine 中的多线程使用 原文链接 http://anshien.blog.163.com/blog/static/169966308201082441114173/   一直都想写 ...

  4. python中的多线程【转】

    转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...

  5. 拒绝卡顿——在WPF中使用多线程更新UI

    原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...

  6. java中的多线程——进度2

    package src;/*多线程总结:1,进程和线程的概念.    |--进程:    |--线程:2,jvm中的多线程体现.    |--主线程,垃圾回收线程,自定义线程.以及他们运行的代码的位置 ...

  7. Qt中的多线程编程

    http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...

  8. 转:MFC中创建多线程

    MFC中创建多线程   MFC的多线程函数必须声明为静态的或者是全局函数(不同的在于全局函数不能访问类的私有静态成员,而静态类函数可以):但这样的线程函数只能访问静态的成员变量,要实现访问类的其他成员 ...

  9. C#中的多线程-入门

    概述与概念C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多 ...

  10. NET 中的多线程

    NET 中的多线程 为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在 ...

随机推荐

  1. 【牛客】路径计数机 (树形dp 前缀和)

    题目描述 有一棵n个点的树和两个整数p, q,求满足以下条件的四元组(a, b, c, d)的个数:  1.$1\leq a,b,c,d \leq n$  2.点a到点b的经过的边数为p.  3.点c ...

  2. [技术博客]windows中使用docker技术

    背景 我们的工程使用了一个叫做termux的安卓上的linux终端,这个终端在所有的软件包里硬编码了软件的运行路径(/data/data/com.termux/..),由于安卓系统的权限设计,我们名为 ...

  3. 记一次netty http server给客户端返回reset包排除

    类似文章:解决用netty去做web服务时,post长度过大的问题 现象:当客户端给server发送的请求体较大时,服务直接给客户端返回reset包. tcpdump: 应用还没有完全收上去,就clo ...

  4. pd.ExcelWriter(to_excel)保存结果到已存在的excel文件中

    网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...

  5. 小米手机root

    目录 概念 解锁流程 root流程 如何Root? 关于supersu 关于twrp 关于Magisk Manager ref: 申请开发板流程 线刷教程 小米手机root 概念 解锁: 使手机可以刷 ...

  6. 向net core 3.0进击——多平台项目发布与部署

    前言 在经历过好多折腾后,总算是把部署走通了一遍,之前只是简单创建个工程在linux下部署,后来一直将这件事搁置,直到最近刚好团队入手一个小服务器,很显然是linux的,那就没啥说的了,Come On ...

  7. windows下postgresql数据库备份和还原

    1.通过cmd进入数据库的bin目录 cd C:\Program Files\PostgreSQL\9.6\bin 2.执行pg_dump备份命令,localhost 或者IP pg_dump -h ...

  8. 由swap引出的局部变量,形参和指针的小问题

    1.第一种实现swap函数的方法是: swap(int a,int b) { Int c = a;a = b;b =c; } 这表面一看确实是实现了整数a,b的交换,当拿来用时发现,结果并不是我们想要 ...

  9. java面试题实战二

    1.spring 是如何创建bean的? 在IoC容器中,bean的获取主要通过BeanFactory和ApplicationContext获取,这里ApplicationContext实际上是继承自 ...

  10. Visual-Based Autonomous Driving Deployment from a Stochastic and Uncertainty-Aware Perspective

    张宁 Visual-Based Autonomous Driving Deployment from a Stochastic and Uncertainty-Aware Perspective Le ...