任务分割ForkJoin

该代码示例展示了如何使用Java的ForkJoin框架以递归方式分解任务。当任务列表大小超过阈值时,任务被拆分为两个子任务进行计算。每个子任务中,通过KieSession执行DRL规则来处理数据,并对PersonValue对象进行更新。最后,所有任务在ForkJoinPool线程池中执行并获取结果。
摘要由CSDN通过智能技术生成
思路:递归方式逐步分解任务!
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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值