package com.study.forkjoin;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask; public class ForkJoinTest { static ArrayList<String> urls = new ArrayList<String>() {
{
add("http://www.baidu.com");
add("http://www.sina.com");
add("http://www.baidu.com");
add("http://www.sina.com");
add("http://www.baidu.com");
add("http://www.sina.com");
add("http://www.baidu.com");
add("http://www.sina.com");
add("http://www.baidu.com");
}
}; static ForkJoinPool firkJoinPool = new ForkJoinPool(3, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); public static void main(String args[]) throws ExecutionException, InterruptedException {
Job job = new Job(urls, 0, urls.size());
ForkJoinTask<String> forkJoinTask = firkJoinPool.submit(job); String result = forkJoinTask.get();
System.out.println(result);
} public static String doRequest(String url) {
// 模拟网络请求
return "Kody ... test ... " + url + "\n";
} static class Job extends RecursiveTask<String> { List<String> urls;
int start;
int end; public Job(List<String> urls, int start, int end) {
this.urls = urls;
this.start = start;
this.end = end;
} @Override
protected String compute() {
// 计算任务的大小
int count = end - start;
              // 指定拆分逻辑即可,递归拆分由框架实现
if (count <= 5) {
// 直接执行
String result = "";
for (int i = start; i < end; i++) {
String response = doRequest(urls.get(i));
result += response;
}
return result;
} else {
// 继续拆分任务
int x = (start + end) / 2; Job job1 = new Job(urls, start, x);
job1.fork(); Job job2 = new Job(urls, x, end);
job2.fork(); // 固定写法
String result = "";
result += job1.join();
result += job2.join();
return result;
}
}
} }

最新文章

  1. permission denied to create extension &quot;hstore&quot;解决方案
  2. WebApp上滑加载数据...
  3. build.gradle文件详解&lt;转&gt; 推荐
  4. Oracle SQL基本操作
  5. Lambda表达式的演化,委托-匿名方法-Func-Lambda
  6. python SocketServer 源码分析
  7. 中文编码之GB2312,Big5,GBK简介
  8. 让自己的软件实现拖拽打开文件(使用WM_DROPFILES消息和DragQueryFile函数)
  9. 系统负载测试工具-LoadRunner
  10. openfire修改服务器名称方法
  11. php练习1
  12. HashMap 源码分析
  13. 剑指Offer-和为S的连续正数序列
  14. vue学习起步:了解下
  15. SQL Server 利用Profiler观察执行计划是否重用时SP:Cachemiss,SP:CacheInsert以及SP:CacheHit的含义
  16. Istio 流量治理功能原理与实战
  17. Java SpringMVC框架学习(三)springMVC的执行流程
  18. ElasticSearch报 EsThreadPoolExecutor[search, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@c0efba
  19. CPU的寄存器结构
  20. 给category添加基本数据类型属性

热门文章

  1. java http 上传文件夹
  2. UEditor粘贴word
  3. vue 内容增加滚动条自动定位至底部
  4. Noip2013 提高组 Day2 T1 积木大赛
  5. crm-权限管理
  6. 把Cstring类型的字符串转化为char* 字符串;
  7. 8月清北学堂培训 Day6
  8. Python数据类型之数值-Python基础前传(5)
  9. Pwnhub Fantastic Key-一点总结
  10. 使 nodejs 代码 在后端运行(forever)