ThreadPool的线程开启、线程等待、线程池的设置、定时功能
一. 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的线程开启、线程等待、线程池的设置、定时功能相关推荐
- android 双线程等待,在Java/Android中启动另一个线程之前如何等待线程完成?
在回答您的问题之前,我强烈建议您查看 ExecutorServices,例如 ThreadPoolExecutor. 现在回答你的问题: 如果要等待上一个线程完成,在开始下一步之前,您可以在之间添加t ...
- 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )
文章目录 I 线程创建方法 II 线程执行函数 III 线程标识符 IV 线程属性 V 线程属性 1 ( 分离线程 | 非分离线程 ) VI 线程属性 2 ( 线程调度策略 ) VII 线程属性 3 ...
- 线程打印状态_Java线程状态的转换
根据上面关于线程状态的介绍我们可以得到下面的线程状态转换图: BLOCKED与RUNNABLE状态的转换 我们在上面说到:处于BLOCKED状态的线程是因为在等待锁的释放.假如这里有两个线程a和b, ...
- 主线程和子线程的区别,线程之间的通信
1.主线程来向子线程发送消息的方法 在平时写程序时,我们一般都是在子线程中向主线程发送消息,从而完成请求的处理,这个很常见,不用多说了.那么有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程 ...
- Qt 线程(04):同步线程【官翻】
同步线程 前言 尽管线程的目的是允许代码并行运行,但有时线程必须停止并等待其他线程. 例如,如果两个线程试图同时写入同一变量,则结果是不确定的. 强制线程互相等待的原理称为互斥. 这是保护共享资源(如 ...
- 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能
一. ThreadPool简介 ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代. ...
- java基础提升(二):多线程、线程安全、线程状态、等待唤醒机制、线程池
目录 一. 多线程 1.1并发与并行 1.2 线程与进程 1.3 创建线程类 1.3.1 方式一:继承Thread类 1.3.2 方式二:实现Runnable接口 1.3.3 Thread和Runna ...
- java 等待线程池结束_如何等待java线程池中所有任务完成
一.等待线程池所有线程完成: 有时候我们需要等待java thread pool中所有任务完成后再做某些操作,如想要等待所有任务完成,仅需调用threadPool.awaitTermination() ...
- java 等待线程/线程池执行完毕
1.单线程开始并执行完毕 当线程开始后,需要用到join的方法 不废话直接贴代码 public static void main(String args[]) {long begin = System ...
最新文章
- 了解因果论:从珀尔的《为什么》开始
- Dart 基礎 - 4
- 电力电子、电机控制系统的建模和仿真_清华团队研发,首款国产电力电子仿真软件来啦~已捐赠哈工大、海工大、清华使用!...
- [css] 如何在白天和黑夜自动切换页面的颜色?
- firefox addons
- python降维之时间类型数据的处理_Python学习数据降维方法
- python第五章课后题答案_python程序设计基础(嵩天)第五章课后习题部分答案
- .NET反编译工具Reflector及插件Reflector.FileDisassembler.dll
- css div 绝对定位到底部不居中问题
- 【疾病分类】基于matlab SVM农作物叶子虫害识别与分类【含Matlab源码 624期】
- c语言编程下雪,C语言怎么 实现 下雪效果
- 接上篇 按键精灵读写远程数据库,达到读写配置以及验证的效果(升级版)
- 软件测试1 软件测试分类
- 如何保护眼睛,可采用语音方式获取外界知识,并积极锻炼身体做到劳逸结合。
- 购车指南首次买车必看系列之(二): 产权篇
- 计算机网络的基础知识
- html视频怎么转换成图片,WPS演示如何将图片转换成视频?
- 【英文美方阅读】之《The falling of the leaves》——《叶落》
- 最新计算机cpu简介,计算机cpu的类型是什么?计算机CPU分类简介
- ubuntu新建账户并赋予root权限
热门文章
- 【MySQL】windows10下安装使用MySQL8.0
- 调用摄像头并获取图像_获得对摄像头的访问权
- python selenium加bs4批量爬取斗鱼直播信息
- linux oracle无法解析指定的连接标识符_Oracle连接出现ora-12154无法解析指定的连接标识符...
- 交换机实现VLAN的划分
- Spark开发——Spark简介及入门
- 详解支持向量机(SVM)算法与代码实现
- cpu风扇声音大_电脑技巧:电脑风扇声音大的解决方法
- c语言课程设计 矩阵乘法,C语言课程设计(论文)-矩阵乘法.doc
- 第十二课 从宠物商店案例看DAPP架构和WEB3.JS交互接口