很多朋友都想知道java fork有什么用?下面就一起來了解一下吧~
fork / join通過分而治之的方法嘗試使用所有可用的處理器內核來幫助加速并行處理 ,意味著框架“forks”遞歸地將任務分解為較小的獨立子任務,直到它們足夠簡單以便異步執行。
其中所有子任務的結果以遞歸方式連接到單個結果中,或者在返回void的任務的情況下,程序只是等待直到執行完每個子任務。
為了提供有效的并行執行,fork / join框架使用一個名為ForkJoinPool的線程池,它管理ForkJoinWorkerThread類型的工作線程。
在下面的示例中,要處理的工作單元由稱為工作負載的String表示。出于演示目的,該任務是一個荒謬的任務:它只是j簡單的轉為大寫并打印它。
為了演示框架的分支行為,如果workload.length()?大于指定的閾值則使用createSubtask()方法,該示例將分割任務。
String被遞歸地劃分為子串,創建基于這些子串的CustomRecursiveTask實例。
因此,該方法返回List
使用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?createSubtasks()?{ ????????List ?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類,如若要執行此操作,請創建一個表示工作總量的對象,選擇合適的閾值,定義分割工作的方法,并定義執行工作的方法。