目录
线程池
线程池其实是一个线程队列,只是创建跟开启不需要你管,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();
}
}
}