C#基础-线程池

目录

线程池


线程池

线程池其实是一个线程队列,只是创建跟开启不需要你管,C#已经帮你封装好了。

C#基础-线程池_第1张图片

为什么要引进线程池?

因为频繁开启线程和关闭线程会浪费内存资源。(从性能上讲这样是不理想的,因为开关需要时间)

开启线程池最大数量?

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

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

在什么情况下使用线程池? 
    1.单个任务处理的时间比较短 ,一直检测的任务并不适合假如线程池,应该是用Thread类创建一个新的线程。
    2.需要处理的任务的数量大 

线程池使用限制?

C#基础-线程池_第2张图片

 

简单例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

public class Program
    {
        const int cycleNum = 10;
        static void Main(string[] args) 
        {
            // 设置CLR线程池中工作者线程与I/O线程最大数目和最小数目
            ThreadPool.SetMinThreads(1,1);
            ThreadPool.SetMaxThreads(5, 5);
            for(int i = 1; i <= cycleNum; i++)
            {
                // 将方法派入队列,成功返回TURE否则异常System.ArgumentNullException
                ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString());
            }
            Console.WriteLine("主线程执行!");
            Console.WriteLine("主线程结束!");
            Console.ReadKey();
        }
        public static void testFun(object obj)
        {
            Console.WriteLine(string.Format("{0}:第{1}个线 程",DateTime.Now.ToString(),obj.ToString()));
            Thread.Sleep(5000);
        }
    }

利用之前讲的信号灯AutoResetEvent和ManualResetEvent来解决问题线程池终止 

public class Program
    {
        const int cycleNum = 10;
        static int cnt = 10;
        static AutoResetEvent myEvent = new AutoResetEvent(false);
        static void Main(string[] args) 
        {
            ThreadPool.SetMinThreads(1,1);
            ThreadPool.SetMaxThreads(5, 5);
            for(int i = 1; i <= cycleNum; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(testFun),i.ToString());
            }
            Console.WriteLine("主线程执行!");
            Console.WriteLine("主线程结束!");
            myEvent.WaitOne();
            Console.WriteLine("线程池终止!");
            Console.ReadKey();
        }
        public static void testFun(object obj)
        {
            cnt -= 1;
            Console.WriteLine(string.Format("{0}:第{1}个线程",DateTime.Now.ToString(),obj.ToString()));
            Thread.Sleep(5000);
            if (cnt == 0)
            {
                myEvent.Set();
            }
        }
    }

 

 

你可能感兴趣的:(C#基础,c#)