码迷,mamicode.com
首页 > 编程语言 > 详细

【fork/join】java并发编程-fork/join示例

时间:2018-04-08 21:18:50      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:void   rup   pool   sync   print   main   pos   tac   result   

package com.chinamobile.epic.tako.common.graphite.query.sync.impl;

import com.google.common.collect.Lists;

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 < 40; 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();
        List<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.add(firstTask);
            forks.add(secondTask);
            ForkJoinTask.invokeAll(forks);
        } 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

【fork/join】java并发编程-fork/join示例

标签:void   rup   pool   sync   print   main   pos   tac   result   

原文地址:https://www.cnblogs.com/ssslinppp/p/8747252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!