线程池(ThreadPool)
线程池使用起来很简单,但它有一些限制:
- 线程池中的所有线程都是后台线程。如果进程的所有前台线程都结束了,所有的后台线程就会停止。不能把入池的线程改为前台线程。
- 不能给入池的线程设置优先级或名称。
- 对于COM对象,入池的所有线程都是多线程单元线 程。许多COM对象都需要单线程单元线程。
- 入池的线程只能用于时间较短的任务。如果线程要一直运行(如 Word的拼写检查器线程),就应使用 Thread类创建一个线程。
代码示例:
class ThreadPoolDemo { public static void start() { int workerThreads, completionPortThreads; //设置线程最大值 ThreadPool.SetMaxThreads(5, 5); ////设置线程最小值 ThreadPool.SetMinThreads(2, 2); //检索线程池在新请求预测中维护的空闲线程数 ThreadPool.GetMinThreads(out workerThreads, out completionPortThreads); Console.WriteLine("workerThreads:" + workerThreads); Console.WriteLine("completionPortThreads:" + workerThreads); //绑定线程,当有可用线程时执行。 ThreadPool.QueueUserWorkItem(WaitCallback, "第1个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第2个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第3个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第4个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第5个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第6个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第7个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第8个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第9个"); ThreadPool.QueueUserWorkItem(WaitCallback, "第10个"); } static void WaitCallback(object state) { Console.WriteLine("线程调用" + state); int workerThreads, completionPortThreads; //检测可用线程和io线程数 ThreadPool.GetAvailableThreads(out workerThreads, out completionPortThreads); Console.WriteLine("workerThreads:" + workerThreads); Console.WriteLine("completionPortThreads:" + workerThreads); Thread.Sleep(2000); if ("第2个" == state.ToString()) { Thread.Sleep(6000); } Console.WriteLine(state + "调用结束"); } }
浙公网安备 33010602011771号