需求
模拟批量上传处理功能, 接口同步处理, 并返回结果.
如有2w数据上传, 接口接收后并行处理, 最后将部分错误数据返回到页面.
代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;
public class Test {
// result保存所有的异常处理结果
public static CopyOnWriteArrayList<Integer> result = new CopyOnWriteArrayList<>();
public static void main(String[] args) {
// 构建2w条记录
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 20000; i++) {
list.add(i);
}
// 使用ForkJoinPool执行
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(new MyTask(list));
// 打印执行结果
System.out.println("执行完成...");
System.out.println(result.size());
}
}
// 使用不需要返回结果的Task类型RecursiveAction
class MyTask extends RecursiveAction {
private final List<Integer> list;
public MyTask(List<Integer> list) {
this.list = list;
}
@Override
protected void compute() {
// 只有队列里有就分裂, 单个处理时间越长, 分裂的阈值越小
if (list.size() < 2) {
try {
Thread.sleep(new Random().nextInt(10));
int index = list.get(0);
System.out.println("执行: " + index);
if (index % 8 == 0) {
Test.result.add(index);
}
} catch (InterruptedException ignore) {
}
} else {
int midIndex = list.size() / 2;
MyTask left = new MyTask(list.subList(0, midIndex));
MyTask right = new MyTask(list.subList(midIndex, list.size()));
left.fork();
right.fork();
// 等待执行结果
left.join();
right.join();
}
}
}
运行结果
执行: 11250
执行: 11875
执行: 2500
...
执行: 19359
执行: 19368
执行完成...
2500