zoukankan      html  css  js  c++  java
  • 自制线程池2(限制最长执行时间、回调函数)

      在自制线程1中,我们实现了一个,用于低优先级,可设定最大执行线程,可在执行任务过程或是在队列中的任务时销毁的线程不耻,主要应用于需要花费时间较长的任务的工作。

      任务执行的时间长了,说不定因为某些原因,线程执行的任务就死在那了,针对这点加入这样一个功能,记录这个任务执行开始的时间,当它执行的时间如果超过了1h,我们就认为这个工作超过我们的预期了,将它Abort掉。并掉用回调函数ErrCallback,通知客户进行后续的处理工作。如果正常执行可以有一个SuccCallback来处理完成后的操作,当然两个回调是非强制性的。另外执行的任务可以返回一个结果值,改变了build-in threadpool 的WaitCallback没有返回值的设计

         在设计线程池的功能是我曾经考虑单独为每个任务设定超时执行的时间,可是这样的话似乎要为每个任务创建一个定时器来监控任务的执行时间上限是否到了(可能是我没有想到好的解决方案,高手支招哈),基于这种情况,大多数任务执行的时间都非常短,而且也不会出现特别的状况,实际当中,只有极个别的任务会因为一些特殊情况长期未完成任务,因此我考虑了使用一个线程来轮询,interval time设置的相关长一些,这样来清理异常任务占用的线程。而且这样实现起来也相对简单一些。下面给出基于自制线程1篇后的改进版线程池。

    Code

    下面是测试用例

    Code

    目前这个线程池还有这么三个问题,

    1.初始时是没有线程的,当加入任务时根据需要会逐步增加到最大线程,可是之后即使线程空闲,也不会将闲置的线程不abort掉,目前还没想到该怎么解决请高手支招啊,

    2.代码还待严重重构,目前先解决功能性的问题先。

    3.测试不够严谨

     请听我下回分解

    PS:大家只想用一般性的线程池功能的话,推荐使用smartthreadpool 

  • 相关阅读:
    C# 单例模式
    [C# 线程处理系列]专题四:线程同步
    C#实现远程开机(局域网测试通过)
    C#实现类只实例化一次(被多个类访问调用)
    c#委托与事件、消息、WndProc用法(转)
    UML 类图常用表示方法.
    C# Socket 接受数据不全的处理
    执行数据库操作失败: 连接未关闭。 连接的当前状态为打开
    hdu 2018 母牛的故事 动态规划入门题
    Codeforces 1029B. Creating the Contest 动态规划O(nlogn)解法 及 单调队列O(n)解法
  • 原文地址:https://www.cnblogs.com/lexus/p/1263157.html
Copyright © 2011-2022 走看看