zoukankan      html  css  js  c++  java
  • 【fork/join】java并发编程-fork/join示例

    package com.chinamobile.epic.tako.common.graphite.query.sync.impl;
    
    import com.google.common.collect.Lists;
    
    import java.util.Arrays;
    import java.util.Collection;
    import java.util.List;
    import java.util.concurrent.ForkJoinPool;
    import java.util.concurrent.ForkJoinTask;
    import java.util.concurrent.RecursiveTask;
    import java.util.concurrent.TimeUnit;
    
    public class GraphiteQueryTask extends RecursiveTask<List<String>> {
        private List<String> uuids;
    
        private int THRESHOLD = 12;
    
        public GraphiteQueryTask(List<String> uuids) {
            this.uuids = uuids;
        }
    
        public static void main(String[] args) {
            ForkJoinPool pool = ForkJoinPool.commonPool();
    
            List<String> uuids = Lists.newArrayList();
            for (int i = 0; i < 45; i++) {
                uuids.add("uuid-" + i);
            }
    
            List<String> result = pool.invoke(new GraphiteQueryTask(uuids));
            System.out.println("========== 结果 ============");
            System.out.println(result);
    
        }
    
        @Override
        protected List<String> compute() {
            List<String> result = Lists.newArrayList();
            Collection<GraphiteQueryTask> forks = Lists.newArrayList();
    
            if (uuids.size() > THRESHOLD) {
                int mid = uuids.size() >>> 1;
                GraphiteQueryTask firstTask = new GraphiteQueryTask(Lists.newArrayList(uuids.subList(0, mid)));
                GraphiteQueryTask secondTask = new GraphiteQueryTask(Lists.newArrayList(uuids.subList(mid, uuids.size())));
                forks = ForkJoinTask.invokeAll(Arrays.asList(firstTask, secondTask));
            } else {
                result.add(postGraphite(uuids));
            }
    
            for (RecursiveTask<List<String>> task : forks) {
                result.addAll(task.join());
            }
    
            return result;
        }
    
        private String postGraphite(List<String> uuids) {
            System.out.println("============>ThreadId: [" + Thread.currentThread().getId() + "] , uuids.size:[" + uuids.size() + "]");
            System.out.println(uuids);
    
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            return "@@@-" + Thread.currentThread().getId() + "-" + uuids.size();
        }
    }
    
    

    http://www.baeldung.com/java-fork-join

  • 相关阅读:
    PHP实现用户在线状态检测
    php面试题汇集2
    php 调用银联接口 【转载】
    【基础算法】基础算法【转载】
    下ue节点
    Python 字典 列表 嵌套 复杂排序大全
    Linux IO 监控与深入分析
    ELK之kibana的web报错[request] Data too large, data for [<agg [2]>] would be larger than limit of
    Elasticsearch聚合优化 | 聚合速度提升5倍
    elasticsearch bulk批量导入 大文件拆分
  • 原文地址:https://www.cnblogs.com/ssslinppp/p/8747252.html
Copyright © 2011-2022 走看看