栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

7、共享模型之工具 - 3、Fork/Join

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

7、共享模型之工具 - 3、Fork/Join

3、Fork/Join 1)概念

Fork/Join是JDK1.7加入的新的线程池实现,它体现的是一种分治思想,适用于能够进行任务拆分的CPU密集型运算

所谓的任务拆分,是将一个大任务拆分为算法上相同的小任务,直至不能呢个拆分可以直接求解。跟递归相关的一些计算,如归并排序、斐波那契数列,都可以用分支思想进行求解

Fork/Join在分支的思想上加入了多线程,可以把每个任务分解和合并交给不同的线程来完成,进一步提升了运算效率

Fork/Join默认会创建与CPU核心大小相同的线程池

2)使用

提交给Fork/Join线程池的任务需要继承RecursiveTask(有返回值)或RecursiveAction(没有返回值),例如下面定义了一个对1~n之间的整数求和的任务

@Slf4j(topic = "c.AddTask1")
class AddTask1 extends RecursiveTask {

    int n;

    public AddTask1(int n) {
        this.n = n;
    }

    @Override
    public String toString() {
        return "AddTask1{" +
                "n=" + n +
                '}';
    }

    @Override
    protected Integer compute() {

        if (n == 1) {
            log.debug("join {}", n);
            return n;
        }

        // 拆分
        AddTask1 t1 = new AddTask1(n - 1);
        t1.fork();
        log.debug("fork {} + {} ", n, t1);

        // 合并
        int result = n + t1.join();
        log.debug("join {} + {} = {}", n, t1, result);
        return result;
    }
}

执行

public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool(4);
        System.out.println(pool.invoke(new AddTask1(5)));
    }

输出

2022/03/26-23:12:33.029 [ForkJoinPool-1-worker-2] c.AddTask1 - fork 4 + AddTask1{n=3} 
2022/03/26-23:12:33.029 [ForkJoinPool-1-worker-1] c.AddTask1 - fork 5 + AddTask1{n=4} 
2022/03/26-23:12:33.029 [ForkJoinPool-1-worker-3] c.AddTask1 - fork 3 + AddTask1{n=2} 
2022/03/26-23:12:33.029 [ForkJoinPool-1-worker-0] c.AddTask1 - fork 2 + AddTask1{n=1} 
2022/03/26-23:12:33.032 [ForkJoinPool-1-worker-3] c.AddTask1 - join 1
2022/03/26-23:12:33.032 [ForkJoinPool-1-worker-0] c.AddTask1 - join 2 + AddTask1{n=1} = 3
2022/03/26-23:12:33.032 [ForkJoinPool-1-worker-3] c.AddTask1 - join 3 + AddTask1{n=2} = 6
2022/03/26-23:12:33.032 [ForkJoinPool-1-worker-2] c.AddTask1 - join 4 + AddTask1{n=3} = 10
2022/03/26-23:12:33.032 [ForkJoinPool-1-worker-1] c.AddTask1 - join 5 + AddTask1{n=4} = 15
15

用图来表示

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/782681.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号