一. ThreadPool简介

  ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代。

  ThreadPool与Thread的区别:

    ①:Thread每开启一个异步任务,就需要使用一个Thread,具有专一性,即使Thread已经死掉,仍然需要占用资源。

    ②:ThreadPool能实现n个线程处理n+m个异步任务,且没有死线程,默认都是初始化的。

二. 深究ThreadPool类

1:QueueUserWorkItem方法,将方法排入队列以便开启异步线程,它有两个重载。

  a:QueueUserWorkItem(WaitCallback callBack),WaitCallback是一个有一个object类型参数且无返回值的委托

  b:QueueUserWorkItem(WaitCallback callBack, object state),WaitCallback是一个有一个object类型参数且无返回值的委托,state即WaitCallback中需要的参数, 不推荐这么使用,存在拆箱装箱的转换问题,影响性能。

使用方式:

  a:严格的卡定义的写法,第一个重载和第二个重载均是处理有一个参数的函数,大于一个参数需要封装一个实体类,所需参数在实体类的构造函数中引入,然后调用第一个重载即可.

(不推荐这种写法)

通用写法: (可以处理任何参数个数的方法),这里不使用n即可。

ThreadPool.QueueUserWorkItem((n) =>

{

  TestThread2(i.ToString(),i.ToString());

});

通用写法的简化版:

ThreadPool.QueueUserWorkItem(n => TestThread2(i.ToString(), i.ToString()));

代码如下:

2:线程等待(有局限性的)

利用ManualResetEvent类和WaitOne方法,多个线程的话需要写for循环。

运行结果:

更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

3:常用方法

  a:设置工作线程和IO线程的最大和最小值,SetMaxThreads和SetMinThreads。

  b:获取工作线程和IO线程最大、最小、可用值,GetMaxThreads、GetMinThreads、GetAvailableThreads。

测试结果:

三. 扩展一个定时器功能

1:RegisterWaitForSingleObject类,但是不常用.(涉及到定时任务,建议使用Quartz.Net)

2:System.threading命名空间下的Thread类,通过查看源码,构造函数中有四个参数,第一个是object参数的委托,第二个是委托需要的值,

  第三个是调用 callback 之前延迟的时间量(以毫秒为单位)

  第四个是 调用 callback 的时间间隔(以毫秒为单位)

 1   private void button12_Click(object sender, EventArgs e)2         {3             Stopwatch watch = new Stopwatch();4             watch.Start();5             Console.WriteLine("----------------- button_Click 开始 主线程id为:{0}  --------------------------", Thread.CurrentThread.ManagedThreadId);6 7             #region 01-RegisterWaitForSingleObject8             //{9             //    //每隔3s开启一个线程执行业务逻辑
10             //    ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>
11             //    {
12             //        //做逻辑判断,编写业务逻辑
13             //        Console.WriteLine("obj={0},tid={1}, datetime={2}", obj, Thread.CurrentThread.ManagedThreadId, DateTime.Now);
14
15             //    }), "hello world", 3000, false);
16             //}
17             #endregion
18
19             #region 02-Timer类
20             {
21                 //2秒后开启该线程,然后每隔4s调用一次
22                 System.Threading.Timer timer = new System.Threading.Timer((n) =>
23                 {
24                     //书写业务逻辑
25                     Console.WriteLine("我是子线程中的业务逻辑哦");
26                 }, "1", 2000, 4000);
27             }
28             #endregion
29
30
31             watch.Stop();
32             Console.WriteLine("----------------- button_Click 结束 主线程id为:{0}  总耗时:{1}--------------------------", Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds);
33
34         }

原文链接:第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能 - Yaopengfei - 博客园

ThreadPool的线程开启、线程等待、线程池的设置、定时功能相关推荐

  1. android 双线程等待,在Java/Android中启动另一个线程之前如何等待线程完成?

    在回答您的问题之前,我强烈建议您查看 ExecutorServices,例如 ThreadPoolExecutor. 现在回答你的问题: 如果要等待上一个线程完成,在开始下一步之前,您可以在之间添加t ...

  2. 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )

    文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...

  3. 线程打印状态_Java线程状态的转换

    根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图: BLOCKED与RUNNABLE状态的转换 我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放.假如这里有两个线程a和b, ...

  4. 主线程和子线程的区别,线程之间的通信

    1.主线程来向子线程发送消息的方法 在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了.那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程 ...

  5. Qt 线程(04):同步线程【官翻】

    同步线程 前言 尽管线程的目的是允许代码并行运行,但有时线程必须停止并等待其他线程. 例如,如果两个线程试图同时写入同一变量,则结果是不确定的. 强制线程互相等待的原理称为互斥. 这是保护共享资源(如 ...

  6. 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

    一. ThreadPool简介 ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代. ...

  7. java基础提升(二):多线程、线程安全、线程状态、等待唤醒机制、线程池

    目录 一. 多线程 1.1并发与并行 1.2 线程与进程 1.3 创建线程类 1.3.1 方式一:继承Thread类 1.3.2 方式二:实现Runnable接口 1.3.3 Thread和Runna ...

  8. java 等待线程池结束_如何等待java线程池中所有任务完成

    一.等待线程池所有线程完成: 有时候我们需要等待java thread pool中所有任务完成后再做某些操作,如想要等待所有任务完成,仅需调用threadPool.awaitTermination() ...

  9. java 等待线程/线程池执行完毕

    1.单线程开始并执行完毕 当线程开始后,需要用到join的方法 不废话直接贴代码 public static void main(String args[]) {long begin = System ...

最新文章

  1. 了解因果论:从珀尔的《为什么》开始
  2. Dart 基礎 - 4
  3. 电力电子、电机控制系统的建模和仿真_清华团队研发,首款国产电力电子仿真软件来啦~已捐赠哈工大、海工大、清华使用!...
  4. [css] 如何在白天和黑夜自动切换页面的颜色?
  5. firefox addons
  6. python降维之时间类型数据的处理_Python学习数据降维方法
  7. python第五章课后题答案_python程序设计基础(嵩天)第五章课后习题部分答案
  8. .NET反编译工具Reflector及插件Reflector.FileDisassembler.dll
  9. css div 绝对定位到底部不居中问题
  10. 【疾病分类】基于matlab SVM农作物叶子虫害识别与分类【含Matlab源码 624期】
  11. c语言编程下雪,C语言怎么 实现 下雪效果
  12. 接上篇 按键精灵读写远程数据库,达到读写配置以及验证的效果(升级版)
  13. 软件测试1 软件测试分类
  14. 如何保护眼睛,可采用语音方式获取外界知识,并积极锻炼身体做到劳逸结合。
  15. 购车指南首次买车必看系列之(二): 产权篇
  16. 计算机网络的基础知识
  17. html视频怎么转换成图片,WPS演示如何将图片转换成视频?
  18. 【英文美方阅读】之《The falling of the leaves》——《叶落》
  19. 最新计算机cpu简介,计算机cpu的类型是什么?计算机CPU分类简介
  20. ubuntu新建账户并赋予root权限

热门文章

  1. 【MySQL】windows10下安装使用MySQL8.0
  2. 调用摄像头并获取图像_获得对摄像头的访问权
  3. python selenium加bs4批量爬取斗鱼直播信息
  4. linux oracle无法解析指定的连接标识符_Oracle连接出现ora-12154无法解析指定的连接标识符...
  5. 交换机实现VLAN的划分
  6. Spark开发——Spark简介及入门
  7. 详解支持向量机(SVM)算法与代码实现
  8. cpu风扇声音大_电脑技巧:电脑风扇声音大的解决方法
  9. c语言课程设计 矩阵乘法,C语言课程设计(论文)-矩阵乘法.doc
  10. 第十二课 从宠物商店案例看DAPP架构和WEB3.JS交互接口