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