zoukankan      html  css  js  c++  java
  • 【多线程】-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);
            }
    
    输出结果: ![](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个。当然这俩跟我们的机器处理速度也有关系,线程池不是说设置多少个线程就一定会启用到峰值。

  • 相关阅读:
    windows下编译php7图形库php_ui.dll
    php 图形用户界面GUI 开发
    使用PHPStorm 配置自定义的Apache与PHP环境
    公用代码实现两个表的拼接(部分代码)
    WCF学习心得--客户端获取服务端自定义类数据
    动态规划入门——Eddy's research II
    linux route命令学习
    软件度量都该度个啥?(5)——被吹得最多的六西格玛
    VSS的运用小内容(针对于vs2008版本)(小的问题都是,仅供参考--只针对于菜鸟级的)
    cocos2d-x学习日志(13) --A星寻路算法demo
  • 原文地址:https://www.cnblogs.com/yanbigfeg/p/7515535.html
Copyright © 2011-2022 走看看