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. ubuntu下Java通过JNI调用C

    下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...

  2. [原创]STAR法则

    [原创]STAR法则 STAR法则是情境(situation).任务(task).行动(action).结果(result)四项的缩写. STAR法则是一种常常被面试官使用的工具,用来收集面试者与工作 ...

  3. Netty通信网络参数配置

    Netty服务端/客户端网络通信过程中常用的参数: Name Associated setter method "writeBufferHighWaterMark" 默认64 * ...

  4. js获取form表单所有数据

    代码如下: <script type="text/javascript"> // 获取指定form中的所有的<input><select>对象 ...

  5. wx.request 请求与django

    wx.request 1.wx.request相当于ajax请求,和django后台进行交互 官方文档:https://developers.weixin.qq.com/miniprogram/dev ...

  6. 用go写一个简单的看门狗程序(WatchDog)

    简述 因为公司的一些小程序只是临时使用一下(不再维护更新),有的有一些bug会导致崩溃,但又不是很严重,崩溃了重新启动一下就好. 所以写了一个看门狗程序来监控程序,挂了(因为我这里并不关心程序的其他状 ...

  7. 如何设置github的ssh key

    目录 Generate SSH key in putty add key to github git setting How to add SSH key to github Generate SSH ...

  8. nodejs命令行执行时带参数

    nodejs命令行执行时带参数 转 https://www.jianshu.com/p/474e6d76f867   今天项目里突然想在初始化时跑一些数据,于是想起以前在python时可以在命令行里带 ...

  9. [原]globalmapper设置高程配色(globalmapper自定义配色方案)

    1.使用的globalmapper版本:1.8以上(之前的版本也应该支持) 2.将全球DEM加载进去 (零时找的小DEM  全球7级) 3.右击此处,选择“高程图例选项” 4.选择 配置-着色器选项 ...

  10. 【转】Python查找某文件夹下的所有excel文件

    # -*- coding: utf-8 -*- # author:baoshan import os dirname = r'D:\0.shenma\01.聊城资料\01.数据资料\02.聊城年鉴数据 ...