【多线程】-ThreadPool线程池
ThreadPool介绍:
Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法。
微软官网给出的解释:
提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器;
通俗易懂的来说就是:线程池是一个存放线程对象的“池子”,里面存放了已经有限线程后,我们可以在需要的时候直接使用里面的线程,不需要重新去实例化新建线程;
从一个方面也可以说大大减少了性能的损耗,毕竟创建太多的线程也是很浪费资源,有人说我用过做了释放,但是请记住释放也是占用资源的。
其实线程池也是会创建线程的,当一个线程不能满足我们的所有请求的时候他就会十分人性化的增加线程,有人说当线程多了不一样吗?
线程池早已想好了,当一个线程长时间没有接到任务时,就会自己醒来,终止自己来释放资源。
线程池会自觉根据硬件来创建线程。当然是在我们没有特殊设置的情况下。
线程池讲自己的线程划分为工作者线程和I/O线程。工作者线程是执行异步操作的执行线程,而I/O线程则用于通知你一个异步操作任务已经完成。
我们简单创建一个例子:
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
ThreadPool.QueueUserWorkItem(Run, 5);
Console.WriteLine("主线程结束");
Console.ReadKey();
}
private static void Run(object i)
{
Console.WriteLine("线程池值:" + i);
}
输出结果:

从上面我们可以看出主线程没有等待线程方法执行结束,而是继续执行。
所以可以知道线程池也是多线程类似于上一篇中的Thead中的后台线程。
为了方便理解你完全可以理解为线程池就是多线程Thread的后台线程,并做了性能优化,不只是单单创建一个线程那么简单。而是创建或调起已存在线程来执行任务;
Thread中的常用方法:
我们使用ThreadPool线程池后,我们需要对线程进行控制。
1、 QueueUserWorkItem:将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。此方法存在两个参数形式QueueUserWorkItem(WaitCallback)和QueueUserWorkItem(WaitCallback,Object)第一个为把一个无参函数排入队列等待执行,第二个为有参函数排入队列等待执行;
2、 SetMaxThreads:设置可以同时处于活动状态的线程池的请求数目。即可理解为设置线程池活动线程的最大数目。
3、 SetMinThreads:发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量。即可理解为设置线程池的最小保留数目。
在上面的方法基础上我们修改一下代码来看结果:
static void Main(string[] args)
{
Console.WriteLine("主线程开始");
ThreadPool.SetMaxThreads(5, 5);
for (int i = 0; i < 60; i++)
{
ThreadPool.QueueUserWorkItem(Run, i);
}
Console.WriteLine("主线程结束");
Console.ReadKey();
}
private static void Run(object i)
{
Console.WriteLine("当前线程池id:" + Thread.CurrentThread.ManagedThreadId.ToString());
Console.WriteLine("线程池值:" + i);
}
输出结果:

在上面的我设置最大线程池说无5个。从截图也可以看出同一个线程被重复使用了多次执行任务;如果我们使用常规的Thread线程来处理的话恐怕要开60个线程才可以,大大的浪费了资源。而在线程池中我们仅仅值需要5个。当然这俩跟我们的机器处理速度也有关系,线程池不是说设置多少个线程就一定会启用到峰值。
【多线程】-ThreadPool线程池的更多相关文章
- 多线程 ThreadPool线程池
简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...
- Java多线程-ThreadPool线程池(三)
开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...
- Java多线程-ThreadPool线程池-2(四)
线程池是个神器,用得好会非常地方便.本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用.但是(凡事总有个但是),还是觉得讲一讲可能跟有助 ...
- 多线程之旅(ThreadPool 线程池)
一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
[源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...
- ExecutorService 建立一个多线程的线程池的步骤
ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...
随机推荐
- 小强的HTML5移动开发之路(5)——制作一个漂亮的视频播放器
来自:http://blog.csdn.net/dawanganban/article/details/17679069 在前面几篇文章中介绍了HTML5的特点和需要掌握的基础知识,下面我们开始真正的 ...
- Get/POST方法提交的长度限制
1. Get方法长度限制 Http Get方法提交的数据大小长度并没有限制,HTTP协议规范没有对URL长度进行限制.这个限制是特定的浏览器及服务器对它的限制. 如:IE对URL长度的限制 ...
- 一堆C++人找不出内存泄露
一堆C++人找不出内存泄露 内存泄露就像痔疮对于男人,对于C/C++程序员来说,是顽疾.尤其一堆C++人聚集在一起,准备把程序深处的虫子抓出来的时候,那景象是热火朝天,不亦乐乎. 突然,小白甲发布了一 ...
- 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typenam ...
- Java进阶(二十二)使用FileOutputStream写入文件
Java使用FileOutputStream写入文件 绪 在Java中,文件输出流是一种用于处理原始二进制数据的字节流类.为了将数据写入到文件中,必须将数据转换为字节,并保存到文件.请参阅下面的完整的 ...
- JavaScript单线程的疑问与解答
问: JavaScript是单线程的,有任务队列,比如使用setTimeou(func,secs)来在secs毫秒后向任务队列添加func.但是,setTimeout后面跟一个死循环,那么死循环导致任 ...
- C++容器学习,与结构体排序和set来一场邂逅
最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用 ...
- iOS监听模式系列之iOS开发证书、秘钥
补充--iOS开发证书.秘钥 iOS开发过程中如果需要进行真机调试.发布需要注册申请很多证书,对于初学者往往迷惑不解,再加上今天的文章中会牵扯到一些特殊配置,这里就简单的对iOS开发的常用证书和秘钥等 ...
- "《算法导论》之‘图’":不带权二分图最大匹配(匈牙利算法)
博文“二分图的最大匹配.完美匹配和匈牙利算法”对二分图相关的几个概念讲的特别形象,特别容易理解.本文介绍部分主要摘自此博文. 还有其他可参考博文: 趣写算法系列之--匈牙利算法 用于二分图匹配的匈牙利 ...
- Unity Singleton 单例类(Unity3D开发之二十)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...