多线程小结(1)

原文出处

为什么会有线程,为了进程的稳定,一个进程死掉了,不能影响到其他进程,
而为什么会有进程,为了操作系统的稳定,不能在操作系统上操作一个记事本就把整个系统给搞崩溃了;
线程是进程的逻辑单元,多个线程存在共用一个CPU的情况,会出现资源竞争,
为了保证数据不错乱,要对线程进行调度,每隔30毫秒进行一次切换,当然切换的过程存在性能磨损,也是为了用户体验和系统的可靠性牺牲一点性能,在我们多核时代这一点性能其实也是可以忽略的;

线程实现,Net 中关键字 Thread , 分前台线程和后台线程,通过IsBackgournd来标记,一般我们都使用后台线程即异步,线程分优先级去处理,在调度过程中优先级高的优先处理,
Net 中提供了比较丰富的线程API,比如Sleep,Join,Abort 就不再一一赘述了,
线程池是为了解决线程来回切换损失的性能,它的主要作用就是 线程复用,当一个线程处理完成任务后重新回到线程池中,等待下次再用,有时我们异步处理数据时为了提高性能,对数据进行分组,然后分别放在不同的线程中去处理,
比如 一个线程池中有5个线程,一批数据有 1000 条,则每一个线程处理200 条,当然可能会出现不整除的情况,(取模),
当线程处理完成后重新回到池中等待下一个任务,线程池也有不足比如无法实时查看线程进度,不能反馈执行结果,
這样Task 就出现了,Task 是在线程池的基础上进行了封装,优化,
Net 同样也提供了丰富的API ,比如 Run, StartFactory, Wait,WaitAll,ContinueWith 等;

定义就不多说了,直接上代码

 1 /// <summary>  
 2     /// 单线程应用  
 3     /// </summary>  
 4    class Program  
 5    {  
 6      static void Main(string[] args)  
 7      {  
 8         Console.WriteLine("进入主线程");  
 9         User u = new User("小刚");  
10         u.Getshow();  
11         Console.WriteLine("主线程结束");  
12      }  
13    }  
14     public class User  
15     {  
16         private string name;  
17         public User(string name)  
18         {  
19             this.name = name;  
20         }  
21         public void Getshow()  
22         {  
23             Console.WriteLine("Name=>" + name);  
24         }  
25     }  
View Code

这样的一个控制台程序,他就包含了一个线程,这个线程是由系统自动分配给他的,也就是主线程

是从入口函数Main方法开始主线程,进行顺序控制流程。程序到达GetShow时候线程转到该方法内部执行,当该方法内部执行完成之后在回到Main方法里面。继续顺序执行下面的输出Console.WriteLine("主线程结束");执行流程如下。这也就是为啥说是单线程了,只会走一条道。

现在开启一个多线程执行GetShow里面的行为,不采用主线程执行

(这句话的意思是再从系统中拉出来一个线程,去执行其他的方法;不会与主线程抢占“人力”)

 

 1 /// <summary>  
 2 /// 多线程应用  
 3 /// </summary>  
 4 class Program  
 5 {  
 6     static void Main(string[] args)  
 7     {  
 8         Console.WriteLine("进入主线程");  
 9         User u = new User("小刚");  
10         Thread subthread = new Thread(new ThreadStart(u.Getshow));//创建新线程  
11         subthread.Start(); //开启线程  
12         Console.WriteLine("主线程结束");  
13     }  
14 }  
15   
16 public class User  
17 {  
18     private string name;  
19     public User(string name)  
20     {  
21         this.name = name;  
22     }  
23     public void Getshow()  
24     {  
25         Console.WriteLine("Name=>" + name);  
26     }  
27 }  
再开启一个线程

在主线程里面,新开了一个线程,去执行Getshow方法里面的操作。

主线程创建新的线程以后,不会等待Getshow里面的代码执行完毕。//相当于系统又给他分配了一个干活的帮手,俩人齐头并进同时把事干完,但是谁先完成不一定。也可能是主线程也可能是新来的帮手先完成

而是直接执行后面的代码:Console.WriteLine("主线程结束");

 

posted @ 2018-05-12 22:47  ProZkb  阅读(181)  评论(0编辑  收藏  举报