Java实现的并发任务处理实例
作者:xiaofancn 发布时间:2023-05-22 17:51:10
标签:Java,并发,任务
本文实例讲述了Java实现的并发任务处理方法。分享给大家供大家参考,具体如下:
public void init() {
super.init();
this.ioThreadPool = new ThreadPoolExecutor(50, 50, Long.MAX_VALUE, TimeUnit.SECONDS, new java.util.concurrent.LinkedTransferQueue<Runnable>(), new ThreadFactory() {
AtomicLong id = new AtomicLong();
@Override
public Thread newThread(final Runnable r) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
r.run();
} catch (RuntimeException e) {
logger.error("执行IO异常", e);
throw e;
}
}
});
t.setDaemon(true);
t.setName("FootballService-IO-" + id.getAndIncrement());
return t;
}
});
}
//从fdate到tdate, 结果: 日期 30个区的创建角色总和
public Map<String, Long> countCreateRole(String fdate, String tdate, final String channel, Map<String, Object> gameConfig) throws Exception {
// 只读数据不需要处理并发
final Map<String, String> param = new HashMap<String, String>();
param.put("fdate", fdate);
param.put("tdate", tdate);
param.put("channel", channel);
final Map<String, Long> date_count = new HashMap<String, Long>();
final List<String> zones = (List<String>) gameConfig.get("areas");
Set<String> dateSet = JdbcTool.getDateRangeByDay(fdate, tdate, "yyyy-MM-dd");
List<Future<Void>> tasks = new ArrayList<>(zones.size());
for (String date : dateSet) {
final String _date = date;
tasks.add(publicThread.submit(new Callable<Void>() {
@Override
public Void call() {
final AtomicLong count = new AtomicLong();
List<Future<Void>> subTasks = new ArrayList<>(zones.size());
for (String _zone : zones) {
final String zone = _zone;
subTasks.add(ioThreadPool.submit(new Callable<Void>() {
@Override
public Void call() throws Exception {
JdbcTemplate _jdbcTemplate = dataSourceManager.getJdbcTemplate(zone);
String database = dataSourceManager.getDatabase(zone);
String _count = mget(CacheConstant.RZRoleCreateCount, zone + "#" + _date + "#" + channel + "#");
if (_count == null) {
StringBuilder sb = new StringBuilder();
sb.append("SELECT count(roleId) as count ");
sb.append("from " + database + "_log.role ");
sb.append("WHERE DATE(createTime)='" + _date + "' ");
if (param.get("channel") != null) {
sb.append(" AND channelId = '" + channel + "' ");
}
long queryForLong = _jdbcTemplate.queryForLong(sb.toString());
count.addAndGet(queryForLong);
mput(CacheConstant.RZRoleCreateCount, zone + "#" + _date + "#" + channel + "#", queryForLong + "");
} else {
count.addAndGet(Long.valueOf(_count));
}
return null;
}
}));
}
for (Future<Void> task : subTasks) {
try {
task.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
synchronized (date_count) {
date_count.put(_date, count.get());
}
return null;
}
}));
}
for (Future<Void> task : tasks) {
task.get();
}
return date_count;
}
@PreDestroy
public void destroy() {
this.ioThreadPool.shutdownNow();
}
希望本文所述对大家java程序设计有所帮助。


猜你喜欢
- JVM常用GC日志打印参数1. PrintGC最简单的GC参数。启用配置:-XX:+PrintGC日志如下:根据上面红色方框内的数字1、2、
- 目录背景统一接口返回定义API返回码枚举类定义正常响应的API统一返回体定义异常响应的API统一返回体编写包装返回结果的自定义注解定义返回结
- Hibernate ThreadLocal它会为每个线程维护一个私有的变量空间。实际上, 其实现原理是在JVM 中维护一个Map,这个Map
- 基于Java swing+MySQL实现学生信息管理系统:主要实现JDBC对学生信息进行增删改查,应付一般课设足矣,分享给大家。(由于篇幅原
- 一、修改版本和指定生成APK文件名【可选】将项目切换到Project视图,打开app目录下的build.gradle文件1.1 修定软件版本
- 树概念及结构树是一种 非线性 的数据结构,它是由 n ( n>=0 )个有限结点组成一个具有层次关系的集合把它叫做树是因 为它看起来像
- 在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联
- 首先设定TextView的clickable属性为true。可以在布局文件中进行设定,比如:<TextViewandroid:id=&
- maven打包方式使用maven打包插件maven-jar-plugin在pom.xml文件最后新增以下代码。maven-dependenc
- 文件上传大部分通过web前端判断后尾名或者service后端判断后尾名,这种操作具有一定的风险,比如:我可以将一个jsp页面,修改后尾名改成
- SpringMVC文件下载说明: 在 SpringMVC 中,通过返回 ResponseEntity的类型,可以实现文件下载的功能案例演示1
- 本文实例为大家分享了java多线程之铁路售票系统的具体代码,供大家参考,具体内容如下问题:铁路售票,一共100张,通过四个窗口卖完。要求:分
- Android获取分享应用列表详解及实例如果在应用的AndroidManifest.xml中含有 ACTION_SEND 属性,那就证明该应
- 该项目主要实现mybatisplus、多数据源、lombok、druid的集成主要参考 https://mp.baomidou.com/gu
- 一、定义委托delegate void StudentDelegate();//【1】定义一个委托二、定义一个调用和定义事件的类/// &l
- 本篇介绍基于SSM框架(Spring4.0+SpringMVC+Mybatis)组合的Javamail应用,邮箱的话基于腾讯的QQ邮箱,其实
- 什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。
- 在APP项目的开发过程中,经常会用到分享图片的功能,有时候还需要根据当前用户信息获取指定的分享图片,比如要求在用户分享图中显示用户名、Uid
- maven配置阿里云镜像打开maven配置文件,找到标签,添加如下:<mirrors> <mirror>
- 目录问题如下:一. 解决问题一(kafka监听不到数据)二. 解决问题二(kafka为什么会有重复数据发送)三. 解决问题三(kafka数据