`
mlzboy
  • 浏览: 724798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

自制线程池3续

阅读更多

晚上睡觉前想到一些问题,发现有几种情形没有进行测试,遂记录下来进行了今天进行了测试

1.在给线程池派发任务执行完成后,间隔一段时间,再给线程池添加任务看是否正常,根据间隔的时间的长短这里可以分为两种情形,一是复用空闲的线程,另一种是创建线程。

创建线程的情况又分为两种,一种是由于间隔时间过长,系统自动将线程结束了,另一种是线程池设定了最大执行任务时间,虽然间隔的时间不长,但是任务的线程是强制销毁的还是要创建新线程来执行下面的任务。

 

在测试的时间我发我现一个鬼异的现象,我先把我的测试代码例出来

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ThreadPool2;

namespace ThreadPoolTest.MyThreadPool2Test
{
    
class Class3
    
{
        
static void Main(string[] args)
        
{
            MyThreadPool2 pool
=new MyThreadPool2(1,true,10*1000);
            
object state=new object();
            pool.QueueUserWorkItem(call1,state,succ,err);
            Thread.Sleep(
80*1000);
            pool.QueueUserWorkItem(call1, state, succ, err);
            Thread.Sleep(
50* 1000);
            pool.QueueUserWorkItem(call1, state, succ, err);

            Console.ReadLine();
        }


        
private static void err(object state)
        
{
            Console.WriteLine(
"err");
        }


        
private static void succ(object state, object result)
        
{
            Console.WriteLine(
"succ");
        }


        
private static object call1(object state)
        
{
            
while(true)
            
{
                Console.WriteLine(
"call1");
                Thread.Sleep(
2000);
            }

        }

    }

}

 

这里正常的情况应该是这样,执行单项任务最长为10s,两次向线程池提交任务都会创建新的线程来执行,因为10s,第一项加入线程池的任务是完不成的需要强行销毁线程。所以第二项不能复用第一项的任务。

 

这里有趣的现象是,我发现第一项任务的执行时间将近20s,而后面第二次加入的任务执行都是标准的10s这个是为什么?

明明设定了最大执行10s,仅是第一次执行任务不是,为什么?

最后我发现的原因是这样,由于实例化线程池时就开始轮询检测是否有超时任务,而此时还没有向线程池中添加任务,当向线程池中添加任务后,轮询到达第一次10s检测时间,而此时任务的执行时间还未到10s,等到第二次轮询到达时才认为任务超时了,所以第一次加入的任务它比后面的任务执行的长间较长,我们可以通过下面的代码来显现我的观点的正确性

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using ThreadPool2;

namespace ThreadPoolTest.MyThreadPool2Test
{
    
class Class3
    
{
        
static void Main(string[] args)
        
{
            MyThreadPool2 pool
=new MyThreadPool2(1,true,10*1000);
            Thread.Sleep(5000);

            
object state=new object();
            pool.QueueUserWorkItem(call1,state,succ,err);
            Thread.Sleep(
80*1000);
            pool.QueueUserWorkItem(call1, state, succ, err);
            Thread.Sleep(
50* 1000);
            pool.QueueUserWorkItem(call1, state, succ, err);

            Console.ReadLine();
        }


        
private static void err(object state)
        
{
            Console.WriteLine(
"err");
        }


        
private static void succ(object state, object result)
        
{
            Console.WriteLine(
"succ");
        }


        
private static object call1(object state)
        
{
            
while(true)
            
{
                Console.WriteLine(
"call1");
                Thread.Sleep(
2000);
            }

        }

    }

}

 

上图是原来的结果

下图是加了Thread.Sleep(5000)的结果,可以看出,执行的时间少了5s钟,由此可以证明确实是因为记时和任务执行的时间不一致性所引起的。

我本来想改进一下,可后来想了想还是算了,这个问题不大,因为在实际项目中,我们只是要将死亡的任务销毁,我们不需要太过精确,只能执行10分钟,一分也不能多或不能少,差不多就行。

不过等我静下心来,我可以认真的去改进它

 

 

分享到:
评论

相关推荐

    Asynchronous-Server:使用非阻塞 IO 和自制线程池实现的异步服务器,能够使用有限的线程集处理数百个并发网络连接

    3. **线程池**:线程池是一种多线程处理形式,预先创建一定数量的线程,用于处理并发任务。使用线程池可以减少创建和销毁线程的开销,提高响应速度。在Java中,`java.util.concurrent`包下的ThreadPoolExecutor类是...

    ps3混合自制4.86

    【标题】"ps3混合自制4.86"与【描述】"ps3混合自制4.86rebug"指的是PlayStation 3游戏主机上的一个自制系统固件更新。这个更新是针对PS3的Rebug团队开发的,Rebug是PS3社区中知名的第三方开发者团队,他们致力于提供...

    pcb3d库 自制版

    3. **交互式编辑**:PCB3D库自制版支持实时编辑,允许设计师在3D环境中直接调整元器件位置,观察改动对整体布局的影响,提高设计效率。 4. **碰撞检测**:内置的碰撞检测功能可检测电路板上元器件间的冲突,防止因...

    自制pickit3资料

    【标题】"自制Pickit3资料"所涉及的知识点主要围绕Pickit3这款微控制器编程器和调试器展开。Pickit3是由Microchip Technology公司推出的一款强大的开发工具,主要用于编程和调试基于PIC微控制器(MCU)的项目。这份...

    CPU自制入门_cpu内部_cpu自制入门_自制cpu书籍_

    《CPU自制入门》是一本专为对CPU设计与编程感兴趣的读者准备的经典书籍,它深入浅出地介绍了CPU的内部构造和工作原理,是CPU自制入门的绝佳指导资料。通过阅读这本书,你可以了解到从基础的逻辑门电路到复杂的微处理...

    IPHONE 3GS 5.11自制固件工具

    5.11自制固件工具,支持设备iPhone 3GS、iPhone 4、iPhone 4 CDMA、iPhone 4S、iPad 1、iPad 2 Wifi、iPad 2 GSM、iPad 2 CDMA、iPad 2 Wifi, iPad 3 Wifi、iPad 3 Global、iPad 3 CDMA、iPod touch 3G、iPod touch ...

    自制ST-LINK 附原理图与PCB图

    3. **STM32 ST-LINK Utility v4.3.0 setup**:这是STM32 ST-LINK实用程序的安装包,它提供了与自制ST-LINK交互的软件界面,包括编程、调试和固件更新等功能。 4. **st-linkv2_upgrade**:可能是一个固件升级工具或...

    自制XILINX FPGA JTAG下载器.docx

    自制XILINX FPGA JTAG下载器是一种基于USB to JTAG协议转换芯片的设备,用于对FPGA(Field-Programmable Gate Array)进行编程和调试。这种下载器的核心是FT2232H芯片,它原生提供两路RS232串口功能,但可以通过重新...

    自制U盘 自制U盘自制U盘

    标题中的“自制U盘 自制U盘自制U盘”似乎是一个重复的表述,但我们可以理解为这个项目或教程是关于如何自制U盘的。描述部分同样如此,没有提供额外的信息,所以我们主要依赖标签和压缩包内的文件来推断知识点。 ...

    自制升级小板,自制升级小板

    自制升级小板自制升级小板自制升级小板自制升级小板

    自制PCB数控钻孔机3

    下位机由3片单片机组成,分别控制X轴,Y轴,Z轴,下位机开机后自动归零,归零后等待上位机发送命令。线路板最大尺寸180mm X 165mm 钻孔最大尺寸 长0~180mm(X轴),宽0~165mm(Y轴),深0~30mm(Z轴) 超过加工范围...

    自制实用编程器

    自制实用编程器是一种创新的硬件项目,旨在为电子爱好者和工程师提供一种经济高效的方式来编程各种芯片。这样的设备通常由一些基本的硬件组件、接口电路和配套的软件组成,能够读写微控制器、闪存和其他类型的可编程...

    自制激光3D扫描仪

    这里所说的激光扫描测距仪的实质就是3D激光雷达。如上面视频中展现的那样,扫描仪可 以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像 是由很多小点组成的云团,因此常被称之为:...

    自制轻型飞机图纸Piper_J-3_Cub

    《自制轻型飞机图纸Piper J-3 Cub》是一份专为航空爱好者和DIY者提供的详尽指导资料,旨在帮助他们理解并亲手制造Piper J-3 Cub这一经典轻型飞机的全过程。Piper J-3 Cub是二战前后广受欢迎的训练机,以其简单的设计...

    iphone自制固件

    3. **使用工具**:利用如Redsn0w、PwnageTool或Sn0wbreeze等越狱工具,这些工具允许用户创建自定义的固件包。它们会将你的SHSH备份与原始固件相结合,生成一个可以绕过Apple验证的固件。 4. **添加自定义组件**:在...

    自制AvrJTAG(测试通过)

    3. **上位机软件开发**:progisp167,8软件的开发涉及到USB通信协议的实现,以确保PC与自制适配器之间的数据交换。 4. **调试与测试**:在硬件和软件完成后,进行严格的测试,包括基本的链路测试、通信速度测试、...

    战龙飞燕之埃及祖玛自制版无须D3DX9_39.dll版本

    这个版本用稍早的DirectX9 SDK编译,可以不带庞大的DLL文件,建议下载!

    单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)

    单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)单片机C语言程序设计 单片机系统中自制硬件字库的应用(有源码)单片机C语言程序设计 ...

    西门子200PLC编程电缆线自制

    台湾产/国产 6ES7 901-3BF21-0XA0 型 PC/PPI 电缆仿制品:这种电缆不带 RTS 开关,无法设置波特率。这种电缆一般都是 RS232/PPI 电缆,价格较低(大约几十元左右)。 三、自制品 笔者介绍了两种自制的 S7-200 系列...

Global site tag (gtag.js) - Google Analytics