基于多线程任务队列执行时间测试——泛型单例模式落地

目录

  • 基于多线程任务队列执行时间测试——泛型单例模式落地
  • 1.需求
  • 2.遇到的问题
  • 3.解决思路
  • 4.具体代码
    • 4.1泛型单例
    • 4.2 开始时间实体
    • 4.3 实例化单例
    • 4.4 获取任务结束时间
  • 5.小结
    • 5.1 本文提供了单例模式实际应用中的一次落地;
    • 5.2 单例模式适用于全局不变的实例;
    • 5.3 泛型实现单例,适用于不同的数据类型实例;
    • 5.4 单例可以跨线程,内存级别共享。

基于多线程任务队列执行时间测试——泛型单例模式落地

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

时间: 2024-11-09 02:03:40

基于多线程任务队列执行时间测试——泛型单例模式落地的相关文章

基于多线程的TCP服务器项目【开源】

本文提供一个完整的TCP Server实例,包括动态连接库.单元测试.验收测试.Winform模拟测试.供新手学习,还望老手多提意见. 项目地址:https://tcpserversocket.codeplex.com/ (可直接Download项目工程) 系统结构 项目文件如下: TcpServerSocket:项目核心动态链接库,如果在别的项目中使用,只用引用该项目生成的DLL即可: WindowsFormsApplication1:一个简单的winform应用程序,让你快事了解如何在Win

基于端口的虚拟局域网测试

基于端口的虚拟局域网测试 一.什么是VLAN: VLAN,是英文Virtual Local Area Network的缩写,中文名为"虚拟局域网", VLAN是 一种将局域网(LAN)设备从逻辑上划分(注意,不是从物理上划分)成一个个网段(或者 说是更小的局域网LAN),从而实现虚拟工作组(单元)的数据交换技术. VLAN 主要用来解决如何将大型网络划分成多个小网络,隔离原本在同一个物理LAN中的不同主机间的二层通信: 在LAN中,各主机之间的通信是物理通信(二层通信): 在VLAN中

基于多线程的C#版QQ农场

基于多线程的C#版QQ农场(图形图像,文件和流,多线程,Web服务) 课程链接:http://www.dwz.cn/wkkAv 咨询QQ2110053820 课程讲师:蝈蝈 课程分类:.Net 适合人群:初级 课时数量:35课时 更新程度:完毕 用到技术:文本编辑器的实现.图形图像编程.多线程编程.文件和流 涉及项目:QQ农场 课程简介: 模拟QQ农场是以农场为背景的模拟经营类游戏,前身为"五分钟"团队开 发的开心农场,后面则嵌入在Q间和QQ校友(腾讯朋友)平台中的应用程序 游戏.游戏

基于覆盖率的精准测试

精准测试是根据代码变更来选择用例的测试策略,用于回归测试.它有利于缩小用例范围,提高执行效率,降低问题定位时间,支持持续集成的极速门禁和冒烟测试.精准测试要求代码的自动化覆盖率比较高,且用例间无依赖. 基于覆盖率的精准测试,布布扣,bubuko.com

可伸缩多线程任务队列(转载)

出自:http://blog.csdn.net/tianmohust/article/details/9335243 在我们的工作中,我们经常需要异步执行一些任务,下面介绍的这个可伸缩多线程队列,可满足我们的需求. 出自:http://www.codeproject.com/Articles/4148/Multithreaded-Job-Queue,主要有以下几个功能: 1.任务队列是多线程,许多任务可以异步进行,任务队列使用线程池来执行任务. 2.任务队列支持优先级,优先级高的任务优先执行(即

华为测试 求小球落地5次后所经历的路程和第5次反弹的高度

假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高? 输入起始高度,int型 分别输出第5次落地时,共经过多少米第5次反弹多高 [去掉小数末尾无效的0] 样例输入:1 样例输出:2.875 0.03125 #include<iostream> using namespace std; double high(double H,int N); double total(double H,int N); int main() {

JAVA学习第六十课 — UDP协议 &amp;基于多线程模拟简单的QQ聊天程序

UDP传输 UDP有发送端和接受端,有两大类,DatagramSocket.DatagramPacket 建立发送端和接收端 建立数据包 调用Socket的接收发送方法 关闭Socket 注意:发送端和接收端是两个独立的运行程序 UDP发送端演示 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号. public static voi

基于iCamera App Kit 测试oV5640 500w分辨率 摄像头 总结

基于iCamera App Kit 测试oV5640 摄像头 总结 iCamera App Kit 下载地址 http://pan.baidu.com/s/1kUMIwB1 可以参考下载链接的说明手册,里面有目前测试过的各款说明,本博客也会陆续更新各款测试效果和使用的说明 对于驱动安装,基本使用的问题,基本每个篇幅都有介绍,再次不重复叙述,详情可以关注说明书. 本摄像头,不含自动对焦功能 目前提供两个版本测试文件 5M(2592*1944)和VGA(640*480) 我们提供两种分辨率测试:有上

Linux 下基于多线程服务器/客服端聊天程序源码

Linux 下基于多线程服务器/客服端聊天程序,采用阻塞的socket技术,和多线程技术实现. 客服端程序:client.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h>