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);
}

输出结果:
![](http://images2017.cnblogs.com/blog/809005/201709/809005-20170913160950328-582065685.png)

从上面我们可以看出主线程没有等待线程方法执行结束,而是继续执行。

所以可以知道线程池也是多线程类似于上一篇中的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线程池的更多相关文章

  1. 多线程 ThreadPool线程池

    简单说明一下: 线程池可以看做容纳线程的容器:一个应用程序最多只能有一个线程池:ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池: 每排入一个工作函数,就相 ...

  2. Java多线程-ThreadPool线程池(三)

    开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...

  3. Java多线程-ThreadPool线程池-2(四)

    线程池是个神器,用得好会非常地方便.本来觉得线程池的构造器有些复杂,即使讲清楚了对今后的用处可能也不太大,因为有一些Java定义好的线程池可以直接使用.但是(凡事总有个但是),还是觉得讲一讲可能跟有助 ...

  4. 多线程之旅(ThreadPool 线程池)

    一.什么是ThreadPool 线程池(源码) 1.线程池顾名思义,有我们的系统创建一个容器装载着我们的线程,由CLR控制的所有AppDomain共享.线程池可用于执行任务.发送工作项.处理异步 I/ ...

  5. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  6. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  7. C#多线程之线程池篇1

    在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...

  8. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  9. ExecutorService 建立一个多线程的线程池的步骤

    ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...

随机推荐

  1. shell sed过滤器详解

    1. Sed简介sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中 ...

  2. (十三)UITableView数据模型化

    多组数据的TableView的设计方法:每一组用一个模型对象表示. 模型包含了标题数据和行数据的数组,在控制器里包含模型的组来对各个模型进行初始化. 在tableView相应的方法中,从控制器的模型组 ...

  3. 数据结构基础(2) --顺序查找 & 二分查找

    顺序查找 适用范围: 没有进行排序的数据序列 缺点: 速度非常慢, 效率为O(N) //实现 template <typename Type> Type *sequenceSearch(T ...

  4. python模块:调用系统命令模块subprocess等

    http://blog.csdn.net/pipisorry/article/details/46972171 Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻 ...

  5. 浅谈C之精华---指针

    今天是2016年的第一天,祝大家元旦快乐!哎,今天有点倒霉,代码写到一半,突然机子就没电了,幸好有保存,否则今天没有这篇日志的出现. 好了,今天以我个人的角度来深度剖析一下C语言中关于指针的用法以及注 ...

  6. 利用JQuery直接调用asp.net后台方法

    利用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. [WebMethod]   命名空间 1.无参数的方法调用, 注意:1.方法一定要静态方法,而且要有[WebMethod] ...

  7. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  8. Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  9. 【Android 应用开发】Android之Bluetooth编程

    Android Bluetopth 编程大牛文章 http://my.oschina.net/u/994235/blog?catalog=313604 ViewGroup 相关资料 : http:// ...

  10. lpad函数

    函数介绍 lpad函数是Oracle数据库函数,lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 2 ...