千家信息网

怎么用ForkJoin写一个并发执行任务的工具类BatchTaskRunner

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,本篇内容介绍了"怎么用ForkJoin写一个并发执行任务的工具类BatchTaskRunner"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些
千家信息网最后更新 2024年11月28日怎么用ForkJoin写一个并发执行任务的工具类BatchTaskRunner

本篇内容介绍了"怎么用ForkJoin写一个并发执行任务的工具类BatchTaskRunner"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

实际编程中经常需要并发执行多个任务,并等待这些任务运行结束返回结果。

所以用 Java 的 ForkJoin 简单撸了一个工具类:

package com.gitee.search.utils;import java.util.List;import java.util.concurrent.ForkJoinTask;import java.util.concurrent.RecursiveAction;import java.util.function.Consumer;/** * Batch task action * @author Winter Lau */public final class BatchTaskRunner extends RecursiveAction {    protected int threshold = 5; //每个线程处理的任务数    protected List taskList;    Consumer action;    /**     * @param taskList      任务列表     * @param threshold     每个线程处理的任务数     */    private BatchTaskRunner(List taskList, int threshold, Consumer action) {        this.taskList = taskList;        this.threshold = threshold;        this.action = action;    }    /**     * 多线程批量执行任务     * @param taskList     * @param threshold     * @param action     */    public static  void execute(List taskList, int threshold, Consumer> action) {        new BatchTaskRunner(taskList, threshold, action).invoke();    }    @Override    protected void compute() {        if (taskList.size() <= threshold) {            this.action.accept(taskList);        }        else {            this.splitFromMiddle(taskList);        }    }    /**     * 任务中分     * @param list     */    private void splitFromMiddle(List list) {        int middle = (int)Math.ceil(list.size() / 2.0);        List leftList = list.subList(0, middle);        List RightList = list.subList(middle, list.size());        BatchTaskRunner left = newInstance(leftList);        BatchTaskRunner right = newInstance(RightList);        ForkJoinTask.invokeAll(left, right);    }    private BatchTaskRunner newInstance(List taskList) {        return new BatchTaskRunner(taskList, threshold, action);    }}

使用方法:

List allTasks = Arrays.asList(1,2,3,4,5);int taskPerThread = 1;BatchTaskRunner.execute(allTasks, taskPerThread, tasks -> {    System.out.printf("[%s]: %s\n", Thread.currentThread().getName(), tasks);});

这里假设有5个任务(allTasks),其中 taskPerThread 是指定每个线程处理的任务数。

而 { ... } 内就是任务的处理逻辑。

超简单。

"怎么用ForkJoin写一个并发执行任务的工具类BatchTaskRunner"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0