網站首頁 學習教育 IT科技 金融知識 旅遊規劃 生活小知識 家鄉美食 養生小知識 健身運動 美容百科 遊戲知識 綜合知識
當前位置:趣知科普吧 > IT科技 > 

fork|java

欄目: IT科技 / 發佈於: / 人氣:6.23K

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

很多朋友都想知道java fork有什麼用?下面就一起來了解一下吧~

fork / join透過分而治之的方法嘗試使用所有可用的處理器內核來幫助加速並行處理 ,意味着框架“forks”遞歸地將任務分解爲較小的獨立子任務,直到它們足夠簡單以便異步執行。

其中所有子任務的結果以遞歸方式連接到單個結果中,或者在返回void的任務的情況下,程序只是等待直到執行完每個子任務。

爲了提供有效的並行執行,fork / join框架使用一個名爲ForkJoinPool的線程池,它管理ForkJoinWorkerThread類型的工作線程。

java fork

RecursiveAction - 一個例子

在下面的示例中,要處理的工作單元由稱爲工作負載的String表示。出於演示目的,該任務是一個荒謬的任務:它只是j簡單的轉爲大寫並打印它。

爲了演示框架的分支行爲,如果workload.length() 大於指定的閾值則使用createSubtask()方法,該示例將分割任務。

String被遞歸地劃分爲子串,創建基於這些子串的CustomRecursiveTask實例。

因此,該方法返回List <CustomRecursiveAction>。

使用invokeAll()方法將列表提交給ForkJoinPool:

public class CustomRecursiveAction extends RecursiveAction {    private String workload = "";    private static final int THRESHOLD = 4;    private static Logger logger =       Logger.getAnonymousLogger();    public CustomRecursiveAction(String workload) {        this.workload = workload;    }    @Override    protected void compute() {        if (workload.length() > THRESHOLD) {            ForkJoinTask.invokeAll(createSubtasks());        } else {           processing(workload);        }    }    private List<CustomRecursiveAction> createSubtasks() {        List<CustomRecursiveAction> subtasks = new ArrayList<>();        String partOne = workload.substring(0, workload.length() / 2);        String partTwo = workload.substring(workload.length() / 2, workload.length());        subtasks.add(new CustomRecursiveAction(partOne));        subtasks.add(new CustomRecursiveAction(partTwo));        return subtasks;    }    private void processing(String work) {        String result = work.toUpperCase();        logger.info("This result - (" + result + ") - was processed by "          + Thread.currentThread().getName());    }}

此模式可用於開發自己的RecursiveAction類,如若要執行此操作,請創建一個表示工作總量的對象,選擇合適的閾值,定義分割工作的方法,並定義執行工作的方法。

Tags:fork java