当前位置:科普知识站>IT科技>

java|fork

IT科技 阅读(7.34K)

<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类,如若要执行此操作,请创建一个表示工作总量的对象,选择合适的阈值,定义分割工作的方法,并定义执行工作的方法。