ForkJoin 实现分而治之
把一个复杂的问题分解成多个相似的子问题,然后把子问题分解成更小的子问题,知道子问题简单到可以直接求解。
算法领域有分治算法(归并排序、快速排序都属于分治算法,二 分法查找也是一种分治算法);大数 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 种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
评论