线程与线程池

发布日期:2018-02-08    浏览次数:438

先了解一个概念,CLR,以前认为CLR就只是一个软件运行的环境,今天发现其实并不是这样。每个.net程序都运行在一个完全独立的CLR实例上,每个CLR都有一个线程池,当然一个进程也可以加载多个CLR。

为什么要使用线程池,即比起直接新建线程的优势在哪里?

线程池其实就是一个存放线程对象的“池子(pool)”,他提供了一些基本方法,如:设置pool中最小/最大线程数量、把要执行的方法排入队列等等。ThreadPool是一个静态类,因此可以直接使用,不用创建对象。

每新建一个线程都需要占用内存空间和其他资源,而新建了那么多线程,有很多在休眠,或者在等待资源释放;又有许多线程只是周期性的做一些小工作,如刷新数据等等,太浪费了,划不来,实际编程中大量线程突发,然后在短时间内结束的情况很少见。于是,就提出了线程池的概念。线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性,其次,开发人员把线程交给系统管理,可以集中精力处理其他任务。

什么时候使用线程池?

1.单个任务处理的时间比较短 

2.需要处理的任务的数量大 

线程池最多管理的线程数?

线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000

通过线程池创建的线程默认为后台线程,优先级默认为Normal。

下面列出在网上找到的两个例子:

例1:使用线程池的基本方法

static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(ThreadMethod1,new object());
Console.ReadKey();
}
public static void ThreadMethod1(object val)
{
    for (int i = 0; i <= 500000000; i++)
      {
          if (i % 1000000 == 0)
           {
             Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
           }
     }
}

例2:使用线程池的优势

线程池中最多5个线程,执行一个方法60次,算5年总工资,如下:

如果不采用线程池,恐怕要开60线程异步执行Run()方法,空间资源之浪费,可见一斑。而现在我们最多用了5个线程。

 

本文网址:https://www.wyxxw.cn/blog-detail-2-6-83.html

返回列表

非特殊说明,本文版权归原作者所有,转载请注明出处

提示:本站所有资源仅供学习与参考,请勿用于商业用途。图片来自互联网~如侵犯您的权益,请联系QQ:1067507709.

提示:转载请注明来自:https://www.cnblogs.com/qingtianlu/p/8370827.html 。 转载人:momo