zoukankan      html  css  js  c++  java
  • 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();
    
    }
    
  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/jpfss/p/9598997.html
Copyright © 2011-2022 走看看