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程序设计有所帮助。