参考文章:MSDN:System.Threading命名空间:
MSDN:Thread类:
c#温故而知新:线程篇:
c#多线程学习:
c#线程手册:
c#中的线程:
C#线程、多线程、线程池、后台线程:
----------------------------------------------------------------------------------------------------------------
学习了解到线程的内容的确是负责繁多,这里只是作为个人学习要点的记录,并参考各位前辈的博文所得
Thread的2个构造函数:
一: 用于带object且无参数的方法的抽象(委托)
二: 用于无参数且无返回的方法的抽象(委托)
通过在程序前
Using System.Threading;
来获得线程有关成员的命名空间
1.声明线程对象的委托类型签名为
void 函数名()void 函数名(object obj参数名)
其中都为无返回值的方法,而带有传入参数的方法,必须为object类型
2.声明线程对象的方式
直接利用函数名声明
Thread 线程对象=new Thread(函数名);
将函数转化为委托再进行声明
Thread 线程对象=new Thread(new ThreadStart(函数名));//无参数委托声明Thread 线程对象=new Thread(new ParameterizedThreadStart(函数名));//有object参数委托声明
利用匿名方法声明
Thread 线程对象 = new Thread( () => { /*方法的实现过程*/ });
3.Thread类型和对象的方法浅析
Thread.Sleep(毫秒);
Sleep方法会使得当前执行的线程以一定的时间挂起,从而让出资源好方便给其他的线程进行执行,注意Sleep是Thread类型的静态方法,对其的调用只对当前执行的线程起作用
Thread对象.Jion();
Jion方法起到阻塞其他线程的执行,只等待当前调用该方法的线程对象执行完毕后,再允许其他线程继续执行
Thread对象.start();Thread对象.start(object参数);
start方法起到开始线程执行的作用,当遇到委托方法是带object的参数时,可以通过该方法来传入参数
Thread对象.Abort();
Abort方法起到对调用方法的线程对象的释放和终止,同时引发一个ThreadAbortException异常,
利用Abort结束线程,在本线程码执行区域,线程对象显示的Thread.CurrentThread.ThreadState为AbortRequest,只有当该段线程退出后,才会显示为Aborted
【注意】1.如果对未启动的线程调用Abort,那么线程一旦启动就会被终止
2.对已经挂起的线程调用Abort,会导致引发ThreadStateException异常,并将 AbortRequested 添加到被中止的线程的ThreadState 属性中。直到调用 Resume 后,才在挂起的 线程中引发 ThreadAbortException。如果在正在执行非托管代码的托管线程上调用 Abort,则直到线程返回到托管代码才引发 ThreadAbortException。
Thread对象.Interrupt();
Interrupt方法起到对线程对象的挂起作用,同样在调用此方法的线程上引发一个异常:ThreadInterruptedException,和Abort方法不同的是,被挂起的线程可以唤醒,且被挂起时在本线程的执行区域里。该线程的Thread.CurrentThread.ThreadState为为Running。
Thread对象.Suspend();//挂起当前线程对象Thread对象.Resume();//恢复当前被挂起的线程
Suspend 是让线程对象挂起,而Resume方法能够恢复当钱被挂起的线程
Lock锁的概念及使用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace 线程5{ class Program { static object mylock = new object();//声明一个object类型的id static void Main(string[] args) { IListthreads = new List ();//以IList 声明一组线程对象 for (int i = 0; i < 5; i++) { Thread t = new Thread(new ParameterizedThreadStart(myprocess)); threads.Add(t);//将新的线程对象添加到队列 } for(int i=0;i<5;i++) { threads[i].Start(i);//依次执行线程队列中的对象 //threads[i].Join();这里也可以用Jion方法来控制线程的执行 } } static void myprocess(object i) { lock (mylock)//运用lock,锁住固定代码区域,使得只能一次允许一个线程执行该段代码 { Console.WriteLine("线程{0}执行", i.ToString()); Thread.Sleep(1000); } } }}
Lock的作用是使得每次只允许一个线程去访问执行所锁住区域的代码,从而控制线程的执行
摘要参考:线程的一些常用属性
1 CurrentThread
获取到当前线程的对象
2 IsAlive
判断线程是否处于激活状态
3 IsBackground
设置该线程是否是后台线程,一旦设置true 的话,该线程就被标示为后台线程
再次强调下后台线程的终止不会导致进程的终止
4 IsThreadPoolThread
只读属性标示该线程是否属于线程池的托管线程,一般我通过线程池创建的线程该属性都是true
5 Name
获取到线程的名字,我们可以根据业务或者逻辑来自定义线程的名字
6 Priority
这个属性表示线程的优先级,我们可以用ThreadPriority这个枚举来设置这个属性
ThreadPriority包含有5个优先级大家了解下就行