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时间,并不意味着一定会优先执行完优先级高的线程。
操作系统有他的线程调度算法,因此不能保证操作系统会接受设置的优先级,毕竟操作系统还有其他的线程,不仅仅是只执行你程序的线程。
 

C# 实现多线程的更多相关文章

  1. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  2. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  3. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  4. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  5. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  6. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  7. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  8. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  9. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  10. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

随机推荐

  1. nodeJs学习-10 模板引擎 ejs语法案例

    ejs语法案例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  2. hdu2516 博弈

    找规律,发现时斐波那契数列:打表上. #include<stdio.h> #include<string.h> #define maxn 2147483647 __int64 ...

  3. activemq入门demo

    创建maven工程,pom文件如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  4. 洛谷4137 mex题解 主席树

    题目链接 虽然可以用离线算法水过去,但如果强制在线不就gg了. 所以要用在线算法. 首先,所有大于n的数其实可以忽略,因为mex的值不可能大于n 我们来设想一下,假设已经求出了从0到n中所有数在原序列 ...

  5. Autodesk 卸载工具,一键完全彻底卸载删除autodesk软件专门卸载工具

    autodesk卸载工具(AUTO Uninstaller)是专门为了针对autodesk类软件卸载不干净而导致autodesk安装失败问题进行研发的autodesk一键卸载工具.现在虽然360或一些 ...

  6. Flask学习之十 全文搜索

    英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search 中文翻译地址:http://ww ...

  7. HZOJ 那一天我们许下约定

    比较好想的一道题,只是那个组合数比较恶心. 先说一下我最开始想的$n^4$的沙雕dp: 设f[i][j][k]为前i天给了j个,第i天给了k个,则f[i][j][k]=∑f[i-1][j-k][o]; ...

  8. iOS学习--详解UIView的 contentStretch属性

    通过实例和图片理解UIView的contentStretch属性 方法 通过一个图片建立一个简单的UIImageView 设置它的contentStretch属性 修改它的frame属性 观察 测试用 ...

  9. Python--day24--复习

  10. 2018-8-10-C#-判断文件编码

    title author date CreateTime categories C# 判断文件编码 lindexi 2018-08-10 19:16:52 +0800 2018-2-13 17:23: ...