ThreadPoolExecutor的使用

public void execute()
    {
        //获取一个任务编号
        Long taskIndex=Constants.getTaskIndex();
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        log.warn("[taskName="+taskIndex+"]全量更新程序开始时间:"+(df.format(new Date())));
       
        String pattern="yyyy-MM-dd";
        this.defaultBeforeDay=-3;
        String startDate=DateTimeUtil.beforeDayByMonth(DateTimeUtil.getDateTime(pattern), pattern, this.defaultBeforeDay);
        String endDate=DateTimeUtil.dateToString(new Date(),pattern);
       
        Long dayCount=DateTimeUtil.differenceOfTwoDay(startDate, endDate, pattern);
        String nowDate=DateTimeUtil.beforeDate(startDate, pattern);
        subPool=(ThreadPoolExecutor)Executors.newFixedThreadPool(Constants.DEFAULT_THREAD_POOL_SIZE);
        String fileName;
        BaseThreadTask btt;
        for(int index=0;index<=dayCount;index++)
        {
            nowDate=DateTimeUtil.nextDate(nowDate, pattern);
            fileName=nowDate+".xml";
            btt=new NewsThreadTask(nowDate);
            subPool.execute(btt);
            fileNameList.add(new FileInfo(fileName));
//            new SoftReference<BaseThreadTask>(btt,rq);
        }
        try
        {
            while(subPool.getCompletedTaskCount()<dayCount){}
        }
        catch(OutOfMemoryError e)
        {
            log.error(e.getMessage(),e);
            System.gc();
        }
        subPool.shutdown();
        indexPool=(ThreadPoolExecutor)Executors.newFixedThreadPool(Constants.INDEX_THREAD_POOL_SIZE);
        BaseThreadTask indexTask=new NewsIndexTask(startDate,endDate);
        BaseThreadTask catTask=new NewsCatMapXmlTask(startDate,endDate);
        BaseThreadTask classTask=new NewsClassMapTask(startDate,endDate);
        BaseThreadTask codeTask=new NewsCodeMapTask(startDate,endDate);
        BaseThreadTask fileTask=new GenerateFileTask(fileNameList);
        indexPool.execute(indexTask);
        indexPool.execute(catTask);
        indexPool.execute(classTask);
        indexPool.execute(codeTask);
        indexPool.execute(fileTask);
//        new SoftReference<BaseThreadTask>(indexTask,rq);
//        new SoftReference<BaseThreadTask>(catTask,rq);
//        new SoftReference<BaseThreadTask>(classTask,rq);
//        new SoftReference<BaseThreadTask>(codeTask,rq);
//        new SoftReference<BaseThreadTask>(fileTask,rq);
        try
        {
             while(indexPool.getCompletedTaskCount()<INDEX_THREAD_NUMBER){}
        }
        catch(OutOfMemoryError e)
        {
            log.error(e.getMessage(),e);
            System.gc();
        }
        indexPool.shutdown();
        Constants.setIS_START_INCR_TASK(true);
        log.warn("全量更新结束时间:"+(df.format(new Date())));
    }

 

上面代码中存在一个风险,就是在判断线程池任务完成数的时候可能由于子线程的没有结束导致系统资源不停的开销引发OutOfMemoryError,本来想在所有线程资源上加上个软引用,在OutOfMemoryError前回收资源,不过这样CPU使用率一直在100%状态。暂时还没想到问题的原因。问题原因可能是ThreadPoolExecute中执行Task的时候有个结束状态标志,如果线程run代码中有异常而又没有手动抛出的话,它会循环执行这个Task,直到Task正常结束,不过这个猜测需要测试验证。准备在程序编写完后再写个测试代码来验证这个想法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值