线程(Thread)、线程池(ThreadPool)技术

 

  线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每一个线程都有本身的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不一样的线程能够执行一样的函数,在一个应用程序中,经常须要使用多个线程来处理不一样的事情,这样能够提升程序的运行效率,也不会使主界面出现无响应的状况。在这里主要介绍线程(Thread)、线程池(ThreadPool)两种不一样建立线程的区别编程

  在一般的状况下,当咱们须要开启一个新的线程时,咱们直接经过Thread(继承自 System.Threading;)去建立一个新的线程,这样作有一个好处就是咱们能够拿到这个新建立的线程,而且能够对这个线程去作一些相关的操做。可是经过建立一个新的线程会比较消耗资源,咱们都知道,操做系统的资源是有限的,当用户访问的多了,须要开启的线程也跟着多了,当开启的线程超过系统的最大线程数时,系统就容易出现崩溃。下面咱们来看一下建立100个线程所须要的时间异步

 for (int i = 0; i < 100; i++)//建立100个线程
            {
                new Thread(() =>
                    {
                        Console.WriteLine("建立线程的ID为:"+Thread.CurrentThread.ManagedThreadId);

                    }).Start();
            }

            sw.Stop();
            Console.WriteLine("建立100个线程执行的时间为:"+sw.ElapsedMilliseconds.ToString());

  运行后咱们发现建立100个线程的时间为489ms,而且每一个线程都不一样。当建立的线程数超过系统的最大线程数的话,那么系统直接over了。有没有解决的办法呢,答案固然是有的,就是线程池(ThreadPool)技术。异步编程

  经过建立线程池对象,当须要使用线程时,就去池中看有没有建立好的线程,有的话就直接将建立好的线程拿出来,线程池中没有的话,就新建立一个线程,当线程使用完后,将放回线程池中供下次使用,这样不只能够减小建立线程消耗的时间以及消耗的内存,还可以提升线程的利用率。函数

 for (int i = 0; i < 100; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback((s) => {
                    Console.WriteLine("建立线程的ID为:" + Thread.CurrentThread.ManagedThreadId);
                }));
            }

  从上面的运行结果咱们能够发现,经过线程池去建立的线程,或者更准确点应该是去线程池获取线程比建立线程所花的时间简直是天差地别,线程的ID也是重复的,这也是经过线程池来获取线程能够提升线程的利用率。在这里须要注意的一点是经过线程池获取的线程都默认为后台线程ui

  最后,简单的介绍一下Task工做任务项,Task为.net4.0引入的新的使用线程池技术,微软的MSDN上这样介绍:Task 类的表示的单个操做不会返回一个值,一般以异步方式执行。 Task 对象是一种的中心思想 基于任务的异步编程模式 首次引入.NET Framework 4 中。spa

  在经过工厂开启的新的线程池工做任务项,会直接执行,而经过本身建立的新飞工做任务项,须要本身手动去开启执行操作系统

//使用工厂建立一个工做任务项,并执行了
Task t1 = Task.Factory.StartNew(() => { 
                //执行代码
            });


//Task t1 = new Task(() =>
            //    {
            //        Thread.Sleep(2000);
            //        Console.WriteLine("当前的线程是:"+Thread.CurrentThread.ManagedThreadId);

            //    });
            //t1.Start();//须要手动启动去执行

  总结:在实际的开发中,当不须要对线程进行操做的话,不要手动去建立线程,尽可能的使用线程池技术去建立开启一个线程,能够提升线程的使用效率,使用线程池技术也能够提升应用程序的效率。.net

相关文章
相关标签/搜索