您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么用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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。