基于多线程任务队列执行时间测试——泛型单例模式落地
时间:2019-12-13
本文章向大家介绍基于多线程任务队列执行时间测试——泛型单例模式落地,主要包括基于多线程任务队列执行时间测试——泛型单例模式落地使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
基于多线程任务队列执行时间测试——泛型单例模式落地
1.需求
比如有100个任务,多线程异步执行,统计执行完所有任务所耗费的时间。如,开始线程是线程A,最后的线程是B,记录B的DataTime.Now-A的DataTime.Now.
2.遇到的问题
因为这里涉及到多线程,异步,所以需要在最后一个任务线程判断是否执行完。跟任务开始的线程肯定不属于同一个线程。相当于要在不同线程里记录传递变量。
3.解决思路
需要有个全局的单例来记录A开始的DateTime.Now。然后在B中取当前时间减去A的开始时间,即为面向内存级别的任务队列的执行时间。
4.具体代码
4.1泛型单例
因为开始时间是DataTime类型,而且考虑到以后单例会用到各种类型,所以这里用泛型去实现。
namespace Singleton
{
/**//// <summary>
/// 泛型实现单例模式
/// </summary>
/// <typeparam name="T">需要实现单例的类</typeparam>
public class Singleton<T> where T : new()
{
/**//// <summary>
/// 返回类的实例
/// </summary>
public static T Instance
{
get { return SingletonCreator.instance; }
}
class SingletonCreator
{
internal static readonly T instance = new T();
}
}
}
4.2 开始时间实体
startTime.cs
public class StartTime
{
private DateTime _time;
public StartTime()
{
_time = DateTime.Now;
}
public string Time
{
get { return _time.ToString(); }
}
}
4.3 实例化单例
在主线程中,调用6W个任务之前实例化单例。
var _startTime = Singleton<StartTime>.Instance.Time;
Console.WriteLine("开始时间 " + _startTime );
for (int i=0;i<=60000;i++){
int Wait=rnd.Next(1,10) * 1000;
var parm=new MyParameters{delayTime= 2000, JobNo=i};
obj.Queue(futureTask: async ()=>{await RunMyJob(parm); });
}
4.4 获取任务结束时间
最后一个任务结束时,获取当前时间,再减去单例的任务开始时间即可。
if (_processingQueue.IsEmpty && _runningTasks.IsEmpty)
{
// Interlocked.Exchange might not be necessary
var _oldQueue = Interlocked.Exchange(
ref _tscQueue, new TaskCompletionSource<bool>());
_oldQueue.TrySetResult(true);
_isQueueRunning = false;
var TaskTime = DateTime.Now - Convert.ToDateTime(Singleton<StartTime>.Instance.Time);
Console.WriteLine("任务所用时间 " + TaskTime);
}
5.小结
5.1 本文提供了单例模式实际应用中的一次落地;
5.2 单例模式适用于全局不变的实例;
5.3 泛型实现单例,适用于不同的数据类型实例;
5.4 单例可以跨线程,内存级别共享。
原文地址:https://www.cnblogs.com/JerryMouseLi/p/12034441.html
- 利用TensorFlow生成图像标题
- 保存并加载您的Keras深度学习模型
- 简单、通用的JQuery Tab实现
- Dubbo源码解析 - 远程暴露
- 使用FastText(Facebook的NLP库)进行文本分类和word representatio...
- 声音分类的迁移学习
- 【死磕Java并发】—– J.U.C之AQS:CLH同步队列
- 使用Python完成你的第一个学习项目
- CA,给了数据库,给了机器,为啥也扩不了容?
- 如何使用Anaconda设置机器学习和深度学习的Python环境
- MQ,互联网架构解耦神器
- 预测随机机器学习算法实验的重复次数
- 服务化了,没想到耦合更加严重?
- 如何在Python中扩展LSTM网络的数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python数据库编程。
- ggplot2饼图和图注顺序不一致如何解决
- 基因集富集分析(Gene Set Enrichment Analysis, GSEA)
- R绘制甲基化和表达谱联合分析热图
- Python字符串操作--寻找所有匹配的位置
- java设计模式-工厂模式
- java设计模式-工厂方法模式
- java设计模式-抽象工厂模式
- Prometheus监控神器-Alertmanager篇(1)
- java设计模式-单例模式
- Spring事务专题(三)事务的基本概念,Mysql事务处理原理
- cocos creator使用protobuf实现网络模块
- 简单聊聊红黑树(Red Black Tree)
- cocos creator探照灯效果实现
- servlet/filter/listener/interceptor区别与联系