`
mlzboy
  • 浏览: 756886 次
  • 性别: 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分钟,一分也不能多或不能少,差不多就行。

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

 

 

分享到:
评论

相关推荐

    MyQQ.zip_MYQQ

    2. **多线程与并发处理**:为了处理多个用户连接和消息同步,程序需要支持多线程和并发操作,这可能涉及到线程池、锁机制、异步编程模型等概念。 3. **数据库管理**:用户信息、聊天记录等数据通常存储在数据库中,...

    JAVA 范例大全 光盘 资源

    实例132 执行任务(线程池) 378 实例133 碰撞的球(多线程) 382 实例134 钟表(多线程) 387 实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 ...

    Java范例开发大全 (源程序)

     1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7  实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  ...

    java范例开发大全(pdf&源码)

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...

    java范例开发大全源代码

     1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7  实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) ...

    java范例开发大全

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 滚动的...

    Java范例开发大全(全书源程序)

    实例242 手术任务(线程池) 462 实例243 模拟人工服务台(线程连接池) 466 13.6 线程应用实例 471 实例244 下雪的村庄 472 实例245 小飞侠 474 实例246 飞流直下 477 实例247 多线程断点续传 479 实例248 ...

Global site tag (gtag.js) - Google Analytics