Java实现的并发任务处理实例
本文实例讲述了Java实现的并发任务处理方法。分享给大家供大家参考,具体如下:
publicvoidinit(){
super.init();
this.ioThreadPool=newThreadPoolExecutor(50,50,Long.MAX_VALUE,TimeUnit.SECONDS,newjava.util.concurrent.LinkedTransferQueue<Runnable>(),newThreadFactory(){
AtomicLongid=newAtomicLong();
@Override
publicThreadnewThread(finalRunnabler){
Threadt=newThread(newRunnable(){
@Override
publicvoidrun(){
try{
r.run();
}catch(RuntimeExceptione){
logger.error("执行IO异常",e);
throwe;
}
}
});
t.setDaemon(true);
t.setName("FootballService-IO-"+id.getAndIncrement());
returnt;
}
});
}
//从fdate到tdate,结果:日期30个区的创建角色总和
publicMap<String,Long>countCreateRole(Stringfdate,Stringtdate,finalStringchannel,Map<String,Object>gameConfig)throwsException{
//只读数据不需要处理并发
finalMap<String,String>param=newHashMap<String,String>();
param.put("fdate",fdate);
param.put("tdate",tdate);
param.put("channel",channel);
finalMap<String,Long>date_count=newHashMap<String,Long>();
finalList<String>zones=(List<String>)gameConfig.get("areas");
Set<String>dateSet=JdbcTool.getDateRangeByDay(fdate,tdate,"yyyy-MM-dd");
List<Future<Void>>tasks=newArrayList<>(zones.size());
for(Stringdate:dateSet){
finalString_date=date;
tasks.add(publicThread.submit(newCallable<Void>(){
@Override
publicVoidcall(){
finalAtomicLongcount=newAtomicLong();
List<Future<Void>>subTasks=newArrayList<>(zones.size());
for(String_zone:zones){
finalStringzone=_zone;
subTasks.add(ioThreadPool.submit(newCallable<Void>(){
@Override
publicVoidcall()throwsException{
JdbcTemplate_jdbcTemplate=dataSourceManager.getJdbcTemplate(zone);
Stringdatabase=dataSourceManager.getDatabase(zone);
String_count=mget(CacheConstant.RZRoleCreateCount,zone+"#"+_date+"#"+channel+"#");
if(_count==null){
StringBuildersb=newStringBuilder();
sb.append("SELECTcount(roleId)ascount");
sb.append("from"+database+"_log.role");
sb.append("WHEREDATE(createTime)='"+_date+"'");
if(param.get("channel")!=null){
sb.append("ANDchannelId='"+channel+"'");
}
longqueryForLong=_jdbcTemplate.queryForLong(sb.toString());
count.addAndGet(queryForLong);
mput(CacheConstant.RZRoleCreateCount,zone+"#"+_date+"#"+channel+"#",queryForLong+"");
}else{
count.addAndGet(Long.valueOf(_count));
}
returnnull;
}
}));
}
for(Future<Void>task:subTasks){
try{
task.get();
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
synchronized(date_count){
date_count.put(_date,count.get());
}
returnnull;
}
}));
}
for(Future<Void>task:tasks){
task.get();
}
returndate_count;
}
@PreDestroy
publicvoiddestroy(){
this.ioThreadPool.shutdownNow();
}
希望本文所述对大家java程序设计有所帮助。