C#基础-线程池

本文介绍了线程池的概念,强调了其在性能优化中的作用,指出线程池能避免频繁创建和销毁线程的开销。线程池的最大线程数量与处理器数量相关,并给出了在何时使用线程池的建议。示例代码展示了如何设置线程池大小,以及如何利用线程池执行任务并控制其结束。同时,通过AutoResetEvent实现了线程池的终止机制。
摘要由CSDN通过智能技术生成

目录

线程池


线程池

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

为什么要引进线程池?

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

开启线程池最大数量?

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

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

在什么情况下使用线程池? 
    1.单个任务处理的时间比较短 ,一直检测的任务并不适合假如线程池,应该是用Thread类创建一个新的线程。
    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();
            }
        }
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路奇怪

有钱出钱,没钱多出编程主意啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值