这几天用到多线程时才发现自己对多线程的了解少之又少,仅仅停留在lock上面,
故这几天看了下线程参考手册结合自己的心得整理一下放在博客上作为自己的学习笔记。
好了,我们知道“负载”是一个很时尚,很牛X的玩意,往大处说,网站需要负载,数据库需要负载。往小处说,线程也需要负载,面对海量的
用户请求,我们的单线程肯定扛不住,那么怎么办,一定要负载,所以说多线程是我们码农必须要熟练掌握的一门技术。
在framework中给我们提供了一个Threading命名空间,下面是一个msdn上不完整的截图:
在后面的系列中我也是主要整理这几个类的使用方法和应用场景。
一:Thread的使用
我们知道这个类代表处理器线程,在Thread中有几个比较常用和重要的方法。
<1> sleep: 这个算是最简单的了。
<2> join: 这个可以让并发行处理变成串行化,什么意思呢?上代码说话最清楚。
1 class Test
2 {
3 static void Main()
4 {
5 Thread t = new Thread(Run);
6
7 t.Start();
8
9 //Join相当于把Run方法内嵌如此
10 t.Join();
11
12 //由于t.Join(),主线程必须在执行t.Join()后才能执行自己的操作
13 Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
14 }
15
16 static void Run()
17 {
18 //等待5秒
19 Thread.Sleep(5000);
20
21 Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
22 }
23 }
<3> Interrupt和Abort:这两个关键字都是用来强制终止线程,不过两者还是有区别的。
① Interrupt: 抛出的是 ThreadInterruptedException 异常。
Abort: 抛出的是 ThreadAbortException 异常。
② Interrupt:如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个
contine操作。
Abort:这个就是相当于一个break操作,工作线程彻底死掉。
二:线程使用场景
可能线程的使用有点类似wcf,做一些耗时但不很及时的需求,比如可以开线程下图片,连接数据库等等,当然线程可以用来做负载。
三:对线程的一些思考
我们知道线程的优点还是比较多的,每个线程都需要默认的堆栈空间,所以说线程数受到内存空间大小的限制,如果线程数开的太多
反而适得其反,进程被分配的时间片会被线程分的更细,也就导致了处理器需要更频繁的在线程之间来回切换。