ForkJoinPool多线程自定义拆分小任务并行
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class TestForkJoin {
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool(10);
List<User> list = new ArrayList<>(1000);
// 构建一千个测试数据
for (int i = 0; i < 1000; i++) {
User a = new User();
a.setAge(i);
a.setName(String.valueOf(i));
list.add(a);
}
UserTask task = new UserTask(list);
List<User> list1 = pool.invoke(task);
System.out.println(JSONObject.toJSONString(list1));
}
static class UserTask extends RecursiveTask<List<User>> {
private List<User> list = new ArrayList<>();
static final int SIZE = 100; //设置拆分数量
public UserTask(List<User> list) {
this.list = list;
}
@Override
public List<User> compute() {
// 根据拆分数量进行拆分
List<List<User>> partition = Lists.partition(list, SIZE);
List<UserTask> runTaskList = new ArrayList<>(5);
partition.stream().forEach(userList -> {
if (partition.size() <= 1) {
System.out.println(Thread.currentThread().getName());
userList.stream().forEach(user -> {
user.setAge(user.getAge() + 1);
});
} else {
runTaskList.add(new UserTask(userList));
}
});
if (!runTaskList.isEmpty()) {
invokeAll(runTaskList);
return list;
}
return list;
}
}
static class User {
private Integer age;
private String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}