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