写点什么

ForkJoin 实现分而治之

  • 2022 年 4 月 20 日
  • 本文字数:1079 字

    阅读完需:约 4 分钟

把一个复杂的问题分解成多个相似的子问题,然后把子问题分解成更小的子问题,知道子问题简单到可以直接求解。


算法领域有分治算法(归并排序、快速排序都属于分治算法,二 分法查找也是一种分治算法);大数 MapReduce 也是。

[](()分治模型

分治任务可以分成两个阶段:任务分解,结果合并。


[](()Fork/Join 的使用

Fork/Join 计算框架主要包含两部分,一部分是分治任务的线程池 ForkJoinPool,另一部分是分治任务 ForkJoinTask。这两部分的关系类似 ThreadPoolExecutor 和 Runnable 的关系,都可以理解为提交任务到线程池,只不过分治任务有自己独特类型 ForkJoinTask。

[](()ForkJoinTask
  • ForkJoinTask 是一个抽象类最核心的是 fork()方法和 join()方法,fork()会异步地执行一个子任务,join()会阻塞当前线程来等待子任务的执行结果。

  • ForkJoinTask 有连个子类:

  • RecursiveAction:用递归的方式来处理分治任务,compute()方法没有返回值。

  • RecursiveTask:用递归的方式来处理分治任务,compute()方法有返回值 《一线大厂 Java 面试题解析+后端开发学习笔记 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 +最新架构讲解视频+实战项目源码讲义》开源

[](()使用 ForkJoinTask 实现计算斐波那契数列

package com.thread;


import java.util.concurrent.ForkJoinPool;


import java.util.concurrent.RecursiveTask;


/**


  • 实现斐波那契数列

  • 求出第 n 个斐波那契数列值


**/


public class ForkJoinDemo {


public static void main(String[] args) {


//创建分治任务线程池


ForkJoinPool fjp = new ForkJoinPool(4);


//创建分治任务


Fibonacci fib = new Fibonacci(4);


//启动分治任务

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。


  • 第一,设计模式能让专业人之间交流方便,如下:


程序员 A:这里我用了 XXX 设计模式


程序员 B:那我大致了解你程序的设计思路了


  • 第二,易维护


项目经理:今天客户有这样一个需求…


程序员:明白了,这里我使用了 XXX 设计模式,所以改起来很快


  • 第三,设计模式是编程经验的总结


程序员 A:B,你怎么想到要这样去构建你的代码


程序员 B:在我学习了 XXX 设计模式之后,好像自然而然就感觉这样写能避免一些问题


  • 第四,学习设计模式并不是必须的


程序员 A:B,你这段代码使用的是 XXX 设计模式对吗?


程序员 B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的



从设计思想解读开源框架,一步一步到 Spring、Spring5、SpringMVC、MyBatis 等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了 23 种设计模式,整理的文件如下图一览无余!



搜集费时费力,能看到此处的都是真爱!

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
ForkJoin实现分而治之_Java_爱好编程进阶_InfoQ写作社区