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. jquery跳出当前的each循环的方式

    jquery跳出当前的each循环,使用如下方式: return false;--跳出所有循环:相当于 javascript 中的 break 效果. return true;--跳出当前循环,进入下 ...

  2. 被final关键字坑了

    一直都傻傻的以为用final关键字定义的都是不可变的.没想到的是对基本类型来说,这是一直成立的. 但是对于final修饰的对象,仍然可以修改对象里面的对象和成员变量.不变的只是当前对象的地址. 昨天我 ...

  3. 教你自己写Android第三方库

    其实Android studio的出现很大程度上方便了我们Android开发人员,今天我们说说怎么构建我们自己的库. 依次按File->New Moudle->android Librar ...

  4. 插件化开发—动态加载技术加载已安装和未安装的apk

    首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...

  5. TCP的核心系列 — ACK的处理(一)

    TCP发送数据包后,会收到对端的ACK.通过处理ACK,TCP可以进行拥塞控制和流控制,所以 ACK的处理是TCP的一个重要内容.tcp_ack()用于处理接收到的ACK. 本文主要内容:TCP接收A ...

  6. SharePoint 2013 图文开发系列之入门教程

    做了SharePoint有三年了,大家经常会问到,你的SharePoint是怎么学的,想想自己的水平,也不过是初级开发罢了.因为,SharePoint开发需要接触的东西太多了,Windows操作系统. ...

  7. iOS8 UILocalNotification 增加启动授权

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/46810357 ...

  8. The content of elements must consist of well-formed character data or markup

    java 中使用dom4j解析含有特殊字符的xml文件出现了如题的错误 这个时候需要在特殊字符外面加上 <![CDATA[ /6169220648+20671/1>7+-47390045& ...

  9. 在Mac OS X下搭建gtk编译环境

    首先安装 XQuartz X11 for Mac ,可以到这里下载: http://xquartz.macosforge.org/landing/ 需要一个包管理器,我用的是brew,其他的操作类似: ...

  10. obj-c中-fobjc-arc-exceptions的解释

    在开启ARC之后正常情况下一切和内存有关的申请和释放操作皆不用你关心了,ARC全全帮你包办了.但是还有极少数的情况下,编译器无法为你生成合适的ARC额外代码,比如obj-c异常就是这么一个例子. 话句 ...