ITPub博客

首页 > IT职业 > IT生活 > 5天不再惧怕多线程——第一天 尝试Thread

5天不再惧怕多线程——第一天 尝试Thread

IT生活 作者:hongyueshan 时间:2021-09-09 09:42:14 0 删除 编辑

     原本准备在mongodb之后写一个lucene.net系列,不过这几天用到多线程时才发现自己对多线程的了解少之又少,仅仅停留在lock上面,

故这几天看了下线程参考手册结合自己的心得整理一下放在博客上作为自己的学习笔记。

     好了,我们知道“负载”是一个很时尚,很牛X的玩意,往大处说,网站需要负载,数据库需要负载。往小处说,线程也需要负载,面对海量的

用户请求,我们的单线程肯定扛不住,那么怎么办,一定要负载,所以说多线程是我们码农必须要熟练掌握的一门技术。

    在framework中给我们提供了一个Threading命名空间,下面是一个msdn上不完整的截图:

图片描述

在后面的系列中我也是主要整理这几个类的使用方法和应用场景。

一:Thread的使用

      我们知道这个类代表处理器线程,在Thread中有几个比较常用和重要的方法。

sleep:  这个算是最简单的了。

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(),害的我主线程必须在你执行完后才能执行。
13         Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
14     }
15 
16     static void Run()
17     {
18         //等待5s
19         Thread.Sleep(5000);
20 
21         Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
22     }
23 }

图片描述

图片描述

 Interrupt和Abort:这两个关键字都是用来强制终止线程,不过两者还是有区别的。

        ① Interrupt:  抛出的是 ThreadInterruptedException 异常。

                 Abort:  抛出的是  ThreadAbortException 异常。

        ② Interrupt:如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个

                             contine操作。

                 Abort:这个就是相当于一个break操作,工作线程彻底死掉。 

 

Interrupt:

图片描述

 1 namespace Test
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Thread t = new Thread(new ThreadStart(Run));
 8 
 9             t.Start();
10 
11             //阻止动作
12             t.Interrupt();
13 
14             Console.Read();
15         }
16 
17         static void Run()
18         {
19             for (int i = 1; i 

图片描述

图片描述

 

Abort:   工作线程直接退出,不带走一片云彩。

图片描述

 1 namespace Test
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             Thread t = new Thread(new ThreadStart(Run));
 8 
 9             t.Start();
10 
11             Thread.Sleep(100);
12 
13             //阻止动作
14             t.Abort();
15 
16             Console.Read();
17         }
18 
19         static void Run()
20         {
21             for (int i = 1; i 

图片描述

图片描述

 


二:线程使用场景

    可能线程的使用有点类似wcf,做一些耗时但不很及时的需求,比如可以开线程下图片,连接数据库等等,当然线程可以用来做负载,这里就做

一个小demo,找一个美女网站,面对如此多的图片,一个线程真的吃不消啊,

图片描述

看了下网站主体上有4个tab页,那么我们就开4个线程来负载

图片描述

  1  class Program
  2     {
  3         static void Main(string[] args)
  4         {
  5             string[] str = { "model", "sexy", "belle", "stars" };
  6 
  7             for (int url = 0; url  10; purl--)
 21             {
 22                 for (int pageSize = 0; pageSize  
102 /// 取得HTML中所有图片的 URL。 
103 ///  
104 /// HTML代码 
105 /// 图片的URL列表 
106         public static List GetHtmlImageUrlList(string sHtmlText)
107         {
108             // 定义正则表达式用来匹配 img 标签 
109             Regex regImg = new Regex(@"]*?bsrc[strn]*=[strn]*[""']?[strn]*(?[^strn""']*)[^]*?/?[strn]*>", RegexOptions.IgnoreCase);
110 
111             // 搜索匹配的字符串 
112             MatchCollection matches = regImg.Matches(sHtmlText);
113 
114             List sUrlList = new List();
115 
116             // 取得匹配项列表 
117             foreach (Match match in matches)
118                 sUrlList.Add(match.Groups["imgUrl"].Value);
119             return sUrlList;
120         }
121     }

图片描述

图片描述


三:对线程的一些思考

    我们知道线程的优点还是比较多的,每个线程都需要默认的堆栈空间,所以说线程数受到内存空间大小的限制,如果线程数开的太多

反而适得其反,进程被分配的时间片会被线程分的更细,也就导致了处理器需要更频繁的在线程之间来回切换。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3676/viewspace-2806283/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-30

  • 博文量
    93
  • 访问量
    1011