思路:递归方式逐步分解任务!
public class ForkJoinTest extends RecursiveTask<PersonValue> {
private static final int THRESHOLD = 10;
private List<SMetadataTag> tagList;
private JSONObject sourceData;
private PersonValue personValue;
public ForkJoinTest(List<SMetadataTag> tagList,JSONObject sourceData,PersonValue personValue) {
this.tagList = tagList;
this.sourceData = sourceData;
this.personValue = personValue;
}
@Override
protected PersonValue compute() {
if (tagList.size() < THRESHOLD){
threadTask(tagList,sourceData,personValue);
} else {
// 如果任务大于阈值,就分裂成两个子任务进行计算
int middle = tagList.size() / 2;
ForkJoinTest leftTask = new ForkJoinTest(tagList.subList(0, middle),sourceData,personValue);
ForkJoinTest rightTask = new ForkJoinTest(tagList.subList(middle,tagList.size()),sourceData,personValue);
// 执行子任务
invokeAll(leftTask, rightTask);
// 等待子任务执行完毕并得到其结果
int leftResult = leftTask.join();
int rightResult = rightTask.join();
}
return personValue;
}
public PersonValue threadTask(List<SMetadataTag> list,JSONObject sourceData,PersonValue personValueNew) {
personValueNew = findSMetadataTagByTagType(list, personValueNew, sourceData);
return personValueNew;
}
//计算归一化字段
private PersonValue findSMetadataTagByTagType(List<SMetadataTag> sMetadataTagList, PersonValue personValue, JSONObject sourceDataString) {
sMetadataTagList.forEach(e -> {
if (e.getCalcRules() != null && !e.getCalcRules().equals("{}")) {
KieHelper helper = new KieHelper();
helper.addContent(e.getCalcRules(), ResourceType.DRL);
KieSession ksession = helper.build().newKieSession();
ksession.insert(personValue);
ksession.insert(sourceDataString);
ksession.fireAllRules();
ksession.dispose();
}
});
return personValue;
}
}
调用:
ForkJoinPool forkJoinPool = new ForkJoinPool();
for (int i = groupList.size() - 1; i >= 0; i--) {
ForkJoinTest task = new ForkJoinTest(groupList.get(i), sourceData,personValueT);
// 提交任务到线程池并执行
Future<PersonValue> result = forkJoinPool.submit(task);
try {
log.error("输出结果:{}",result.get());
} catch (Exception e) {
e.printStackTrace();
}
}
forkJoinPool.shutdown();