91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用ForkJoin寫一個并發執行任務的工具類BatchTaskRunner

發布時間:2021-10-21 09:11:01 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

本篇內容介紹了“怎么用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<javayou@gmail.com>
 */
public final class BatchTaskRunner extends RecursiveAction {

    protected int threshold = 5; //每個線程處理的任務數
    protected List taskList;
    Consumer<List> 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 <T> void execute(List<T> taskList, int threshold, Consumer<List<T>> 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<Integer> 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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德格县| 大渡口区| 神池县| 湖南省| 苏尼特右旗| 靖西县| 吉木萨尔县| 鱼台县| 阿勒泰市| 金塔县| 贵定县| 五华县| 鹿邑县| 定西市| 海宁市| 珲春市| 宁陕县| 仪陇县| 辽宁省| 尉犁县| 海林市| 密云县| 弋阳县| 海丰县| 化州市| 青海省| 太和县| 临沂市| 漳平市| 苍南县| 中超| 沧州市| 东乡族自治县| 晋州市| 毕节市| 个旧市| 刚察县| 曲靖市| 宜章县| 聂荣县| 太和县|