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

【fork/join】java并发编程-fork/join示例的更多相关文章

  1. Java 并发编程 -- Fork/Join 框架

    概述 Fork/Join 框架是 Java7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.下图是网上流传的 Fork Join 的 ...

  2. Java并发编程--Fork/Join框架使用

    上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...

  3. 《JAVA并发编程实战》示例程序第一、二章

    第一章:简介 程序清单1-1非线程安全的数值序列生成器 import net.jcip.annotations.NotThreadSafe; @NotThreadSafe public class U ...

  4. 《JAVA并发编程实战》示例程序 第三章

    3.1 可见性 程序清单3-1 在没有同步的情况下共享变量(不要这么做) /** * 主线程和读线程都将访问共享变量:ready 和 number * 结果可能 * 1. 主线程先运行完,读线程后运行 ...

  5. Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  6. (转)Java并发编程:核心理论

    原文链接:https://www.cnblogs.com/paddix/p/5374810.html Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及 ...

  7. Java并发编程:Synchronized及其实现原理

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  8. Java 并发编程:volatile的使用及其原理

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  9. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

随机推荐

  1. STATA一小步 我的一大步

    第一次用STATA,以前一直搞SPSS,简直是生产力革命啊. 记下写的第一个命令 也是实现了一个probit回归 clear cd C:\Users\Qian\Desktop\1 insheet us ...

  2. Win10系列:C#应用控件基础7

    Slider控件 Slider控件包含一个滑动条.一个滑动块和一个取值范围,沿滑动条移动滑动块可以在取值范围内改变Slider控件的值.Slider控件的用途很广泛,例如可以使用Slider控件来设置 ...

  3. MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer

    MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.3 Displaying Classes in a Layer 一.前言 关于第一节的 ...

  4. nginx优化参考

    参考链接:http://blog.sina.com.cn/s/blog_4f9fc6e10102uxib.html 计算访问路径频度 awk -r|more |grep /路径 ps print &a ...

  5. python xml文件解析

    参考链接:http://www.runoob.com/python/python-xml.html

  6. jq demo 九宫格抽奖

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. Linux过滤错误日志

    grep -E 'at |Exception|exception|Error|error|Caused by' test.log

  8. 创建Car类,包含name,price属性,构造器等方法,创建测试类,在main方法中创建Set接口的实现类,添加5个以上的Car对象,遍历集合元素,验证重复元素是否过滤了; 如果没有过滤,实现过滤功能;把每个小车的price降10000元,再遍历,查看price是否已改变

    i汽车类 package com.lanxi.demo2_3; public class Car { private String name; private int price; @Override ...

  9. 使用GraphHttpClient调用Microsoft Graph接口 - PATCH

    博客地址:http://blog.csdn.net/FoxDave 通过前两讲的阐述我们应该大致了解了使用GraphHttpClient调用Microsoft Graph接口的模式,并介绍了使用get ...

  10. python自学第9天,装饰器

    装饰器:本质是函数(装饰其它函数) 就是为其它函数添加附加功能 原则:1.不能修改被装饰函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数即变量 2.高阶函数:a.把一个 ...