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正常结束,不过这个猜测需要测试验证。准备在程序编写完后再写个测试代码来验证这个想法。